StringBuffer和StringBuilder区别

1.字符修改上的区别

1728807086330.png

①当我们需要对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。

②和 String 类不同的是,StringBuffer 和 StringBuilder类的对象能够被多次的修改,并且不产生新的未使用对象,可以减少对内存的使用。

③StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。

④由于 StringBuilder 相较于 StringBuffer 有速度优势,多数情况下建议使用 StringBuilder类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类,由于 StringBuffer 操作字符串的方法加了 synchronized 关键字进行了同步,主要是考虑到多线程环境下的安全问题,所以如果在非多线程环境下,执行效率就会比较低,因为加了没必要的锁。

2.相同点

2.1 初始容量

初始容量都是16和扩容机制都是”旧容量*2+2”

1728819204744.png

1728819211326.png

2.2 底层原理

都是用char[]字符数组实现,且字符数组都是可变的,这点不同于String

1728819234021.png

3. 常用方法

StringBuilder

方法名 介绍
append(int i) 将 int 参数的字符串表示形式追加到此序列。
append(long lng) 将 long 参数的字符串表示形式追加到此序列。
append(Object obj) 追加 Object 参数的字符串表示形式。
append(String str) 将指定的字符串追加到此字符序列。
append(StringBuffer sb) 将指定的 StringBuffer 追加到此序列。
capacity() 返回当前容量。
length() 返回长度(字符数)。
insert(int offset, boolean b) 将 boolean 参数的字符串表示形式插入此序列中。
insert(int offset, char c) 将 char 参数的字符串表示形式插入此序列中。
insert(int offset, char[] str) 将 char 数组参数的字符串表示形式插入此序列中。
insert(int offset, double d) 将 double 参数的字符串表示形式插入此序列中。
insert(int offset, float f) 将 float 参数的字符串表示形式插入此序列中。
insert(int offset, int i) 将 int 参数的字符串表示形式插入此序列中。
insert(int offset, long l) 将 long 参数的字符串表示形式插入此序列中。
insert(int offset, String str) 将字符串插入此字符序列中。
replace(int start, int end, String str) 使用给定 String 中的字符替换此序列的子字符串中的字符。
delete(int start, int end) 移除此序列的子字符串中的字符。
deleteCharAt(int index) 移除此序列指定位置上的 char。
reverse() 将此字符序列用其反转形式取代。
toString() 返回此序列中数据的字符串表示形式。
substring(int start, int end) 返回一个新的 String,它包含此序列当前所包含字符的子序列

StringBuffer

1728819246056.png

1728819254488.png

1728819301180.png

4. 总结

StringBuffer与StringBuilder用法基本相同,在不考虑线程安全的情况下可以互相通用。