JavaSE进阶 第七章 常用类 (二) StringBuffer与StringBuilder

目录

    • 1.StringBuffer的定义与使用
    • 2.StringBuffer与StringBuilder的区别
    • 3.试题
      • 3.1String不可变得原因
      • 3.2StringBuffer与StringBuilder可变的原因
  • 传送门

1.StringBuffer的定义与使用

由于java中字符串是不可变的,需要对字符串频繁拼接是会产生新字符串,占用大量的方法区内存
可以使用java.lang下的StringBuffer和StringBuilder

//创建一个初始化容量为16个byte[]数组。(字符串缓冲区对象)
StringBuffer stringBuffer = new StringBuffer();
//拼接字符串使用append()方法
stringBuffer.append("a");
stringBuffer.append(3.14);
stringBuffer.append(true);
//append方法底层进行追加时,如果byte数组满了,会自动扩容

优化StringBuffer的性能:创建StringBuffer对象时给定一个初始化容量,减少底层扩容次数。
即给一个合适的初始化容量,提高程序的执行效率

StringBuffer sb = new StringBuffer(100);
sb.append("hello");
sb.append("world");

2.StringBuffer与StringBuilder的区别

  • StringBuffer中的方法都有“synchronized”关键字修饰,表示StringBuffer在多线程环境下运行是安全的
  • StringBuilder中的方法没有“synchronized”关键字修饰,表示StringBuilder在多线程环境下运行是不安全的

3.试题

3.1String不可变得原因

源代码中,String类中有一个byte[]数组,这个数组采用了final修饰。而数组一旦创建长度不可变,并且被final修饰后的引用一旦指向某个对象后,不可以再指向其他对象,所以String是不可变的

3.2StringBuffer与StringBuilder可变的原因

源代码中,StringBuffer/StringBuilder内部是一个byte[]数组,这个byte[]数组没有被final修饰,StringBuffer/StringBuilder的初始化容量为16,当存满之后会进行扩容,调用了数组拷贝的System.arraycopy()。所以StringBuffer/StringBuilder适合与使用字符串的频繁拼接操作

传送门

上一章:JavaSE进阶 第七章 常用类 (一) String
下一章:JavaSE进阶 第七章 常用类 (三) 基本数据类型对应的8个包装类

你可能感兴趣的:(JavaSE进阶)