StringBuffer和StringBuilder
- 所属的包:java.lang.
- 继承AbstractStringBuilder,默认
Object - 实现了三个接口。
- Serializable, Appendable, CharSequence
- String类的接口不太一样。
- 它们两个没有compareTo方法。但是不同的接口就是Appendable。含有一个String没有的方法。将给定的字符串追加字符串后面。
出现StringBuffer和StringBuilder的原因:
- String的内部实现是private final char[] value;具有不可变特性。
- 频繁的修改其内容的时候,性能很不好。
- 这两个类,频繁的改变字符串,性能比String类方法的操作字符串的性能好。
- 特性:
- 可变字符串。可变指的长度可变,内容也可变。
- char[] value;数组的地址可以发生变化。产生新的数组。
构建:
最主要的方法:StringBuilder = append();提供了很多的重载。
- StringBuilder是并发访问,速度更快。
- StringBuffer就是线程安全的问题。
- ensureCapacity(int minimumCapacity)确保底层数组容量够用。
- int = capacity();返回StringBuilder的容量。容量并不是有效元素的数量。因为,扩容的时候,一般不会是一个一个扩容。会一次性扩容很多。防止频繁扩容。
- int = length(); 有效元素的长度。跟我们封装的ArrayBox非常的类似。
- char = charAr(int index); int = charPointAt(index);
- String = subString(int start [,int end]);源StringBuilder没有发生变化。返回截取需要的String。
- StringBuilder = delete(int start ,int end); 删除返回自己类型,说明本身自己也发生了变化。
- StringBuilder = deleteCharAt(int index); 删除某一个index的字符。
- StringBuilder = setCharAt(int index, char ch);将某个位置的
char改掉。 - indexOf(String str[, int fromIndex]);
- lastIndexOf(String str[,int fromIndex]);是否存在。顺序不一样。
- StringBuilder = insert(int offset, boolean b);往某一个位置插入一个东西。
- replace(int start, int end, String str); 将某个区间的内容替换。
- StringBuilder = reverse(); 反转字符串。
- void = setLength(int newLength);Sets the length of the character sequence.手动设置字符串的有效长度。不太安全了。那么length的长度就不可信了。
String = toString();将我们StringBuilder对象构建成String。
public String toString() {// Create a copy, don't share the arrayreturn new String(value, 0, count);}
void = trimToSize();Attempts to reduce storage used for the character sequence将数组中无用的容量去掉,就变成length长度的数据。capacity==length;
总结:
- StringBuilder类不一定需要,是为了避免String频繁拼接修改字符串信息时候才用的。底层数组是可变的,提高了心梗。
- 常用方法
- 与String类不同的独有方法
- append,insert,delete,delteCharAt,reverse
- 与String类相同的方法
- charAr,codePointAt,indexOf,lastIndexOf,replace(名字相同,用法不同),length,subString
- 不是很常用的方法。capacity,setLength,ensureCapacity,trimToSize,setCharAt。
- 在笔试中,经常容易考察的知识点。
- String所属的包,继承关系,实现接口
- String的构建方式。常量,构造方法。
- String对象的内存结构。常量存在字符串常量中。new 存在堆内存。
- == 和equals区别。拼接
- String不可变特性。
- String 的常用方法。concat,—-与StringBuilder的区别。
- String和StringBuilder区别。或者String和StringBuffer的区别。
- String是不可变字符串。
- Comparable接口。
- 不可变体现在长度和内容。
- 有一些方法,另一个没有concat,compareTo,toUpperCase。
- StringBuilder或者StringBuffer是可变字符串。
- Appendable接口独有
- 可变的字符串。没有final修饰,底层可以进行数组的扩容。
- 有些方法String 没有。append,insert,delete,reverse。
- String是不可变字符串。
- StringBuffer和StringBuilder不同
- buffer很早jdk 1.0,早期版本,builder很晚 jdk1.5之,更新版本。方法使用几乎一致。
- 通常的早期版本都是线程同步的(同一个时间只有一个线程操作)。安全性高,执行的效率相对较低。通常后期的版本,线程非同步的,安全性比较低,执行效率比较高。带了synchronized 修饰符。保证线程同步。
1:20:
