021-Java的StringBuilder和StringBuffer

96
suhuanzhen
2017.07.15 22:42* 字数 1038

String与 (StringBuilder和StringBuffer)的区别

我们知道String是不可变的,当我们对String变量重新赋值的时候,实际上是将指针指向新的值在内存中的地址,旧值在内存中仍然存在且失去指向它的指针,这样会导致内存无法释放。

当对字符串进行修改的时候,需要使用 StringBuilder和StringBuffer 类。
和 String 类不同的是,StringBuilder和StringBuffer 类的对象能够被多次的修改,始终是在一个对象上操作的,这样就不会像String一样创建一些而外的对象进行操作了,所以速度会比较快。

Java 中 String 是被 final 修饰的,他的长度是不可变的,就算调用 String 的
concat 方法,那也是把字符串拼接起来并重新创建一个对象,把拼接后的 String 的值赋给新创建的对象,这种操作是非常耗费内存的。
而 StringBuilder和StringBuffer 的长度是可变的,可以调用 append 方法来改变 StringBuffer 的长度,也不会产生新的对象。

StringBuilder 和 StringBuffer的区别

用法几乎完全相同,最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问),其他内置的类方法和使用都是一样的。

由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。

简单例子:

public class Test01{
    public static void main(String args[]){
        StringBuilder sBuffer = new StringBuilder("学习教程官网:");
        sBuffer.append("www");
        sBuffer.append(".learn");
        sBuffer.append(".com");
        System.out.println(sBuffer);
    }
}

改成使用StringBuffer只要修改类名,其他都无需改变。

public class Test02{
  public static void main(String args[]){
    StringBuffer sBuffer = new StringBuffer("学习教程官网:");
    sBuffer.append("www");
    sBuffer.append(".learn");
    sBuffer.append(".com");
    System.out.println(sBuffer);  
  }
}

上面两个例子运行结果都是:

学习教程官网:www.learn.com

概括

String 长度大小不可变,速度最慢
StringBuilder和StringBuffer 长度可变
StringBuilder 线程不安全 StringBuffer 线程安全 
StringBuilder 比 StringBuffer速度还要快

StringBuffer常用方法(StringBuilder也一样)

以下是 StringBuffer 类支持的主要方法:

序号 | 方法 | 描述
-|
1 | public StringBuffer append(String s) | 将指定的字符串追加到此字符序列。
2 | public StringBuffer reverse() | 将此字符序列用其反转形式取代。
3 | public delete(int start, int end) | 移除此序列的子字符串中的字符。
4 | public insert(int offset, int i) | 将 int 参数的字符串表示形式插入此序列中。
5 | replace(int start, int end, String str) | 使用给定 String 中的字符替换此序列的子字符串中的字符。

下面的列表里的方法和 String 类的方法类似:

序号 | 方法 | 描述
-|
1 | int capacity() | 返回当前容量。
2 | char charAt(int index) | 返回此序列中指定索引处的 char 值。
3 | void ensureCapacity(int minimumCapacity) | 确保容量至少等于指定的最小值。
4 | void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) | 将字符从此序列复制到目标字符数组 dst。
5 | int indexOf(String str) | 返回第一次出现的指定子字符串在该字符串中的索引。
6 | int indexOf(String str, int fromIndex) | 从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。
7 | int lastIndexOf(String str) | 返回最右边出现的指定子字符串在此字符串中的索引。
8 | int lastIndexOf(String str, int fromIndex) | 返回最后一次出现的指定子字符串在此字符串中的索引。
9 | int length() | 返回长度(字符数)。
10 | void setCharAt(int index, char ch) | 将给定索引处的字符设置为 ch。
11 | void setLength(int newLength) | 设置字符序列的长度。
12 | CharSequence subSequence(int start, int end) | 返回一个新的字符序列,该字符序列是此序列的子序列。
13 | String substring(int start) | 返回一个新的 String,它包含此字符序列当前所包含的字符子序列。
14 | String substring(int start, int end) | 返回一个新的 String,它包含此序列当前所包含的字符子序列。
15 | String toString() | 返回此序列中数据的字符串表示形式。

Java-basic
Web note ad 1