StringBuffer
需要进行大量的字符串拼接操作时,建议使用 java.lang.StringBuffer 和 java.lang.StringBuilder
- 采用+=的方式进行字符串的拼接操作时
String s1 = “a”;
s1 += “b”;
for (int i = 0; i < 100; i++) {
//因为字符串一旦创建不可修改,所以这样操作会在字符串变量池中创建大量的字符串,
//每一次拼接产生新字符串,这样会占用大量的方法区内存,造成内存空间的浪费
s1 += i;
System.out.println(s1);
} - 调用StringBuffer的无参构造方法,由源码可知,默认创建内存容量为16的byte[ ]数组
即StringBuffer底层是一个byte[]数组,
往StringBuffer中放字符串,实际上是放到byte[]数组中了,
StringBuffer stringBuffer = new StringBuffer(); //capacity:内存容量
- 当byte[ ]数组长度超出了默认长度时,会进行自动扩容,底层调用的是数组拷贝System.arraycopy()方法
而频繁的对数组进行扩容,会降低程序运行的效率,所以为了确保效率,要在创建对象时赋予合适的内存容量 - 调用有参构造方法:
String源码中声明:private final byte[] value;
StringBuffer源码中声明:byte[ ] value;
由此可知,因为String方法中的value数组为final修饰,所以不可变
而StringBuffer中的value数组则没有final修饰
StringBuffer stringBuffer2 = new StringBuffer(20); //赋予初始内存容量20
- 可通过String的构造方法将StringBuffer类型转换为String类型
String s2 = new String(stringBuffer);
System.out.println(s2);
- StringBuffer中的常用方法:
//append方法:将指定的字符串追加到此字符序列 append:附加
//public StringBuffer append(String s)
stringBuffer.append("b");
stringBuffer.append(100);
stringBuffer.append(3.14);
stringBuffer.append(true);
//运行结果:
b1003.14true
//replace方法: 使用给定 String 中的字符替换此序列的子字符串中的字符。
//replace(int start, int end, String str)
stringBuffer.replace(4,8,"圆周率");
System.out.println(stringBuffer);
//运行结果:
b100圆周率true
//delete方法:移除此序列的子字符串中的字符
//public delete(int start, int end)
stringBuffer.delete(4, 7);
System.out.println(stringBuffer);
//运行结果:
b100true
StringBuilder
-
StringBuffer类和StringBuilder类使用上大体没啥区别
-
区别:
String 长度大小不可变StringBuffer 和 StringBuilder 长度可变
StringBuffer 线程安全 StringBuilder 线程不安全
StringBuilder 速度快
-
在绝大多数情况下都是使用StringBuilder类更好