java标准库提供了String,StringBuilder,StringBuffer,StringJoiner三个类
String类是不可变的对象,而其他三个类是可变的对象
首先,由于在String类中的定义存储字符串的char[]数组,它被final关键字修饰,所以说String类是不可变的
而其他三个字符串类中char[]数组都没有被定义为final.
其次,String类正因为不可变所以无法预分配缓冲区,只能根据最终结果来分配。而其他三类都已经预分配了缓冲区。
内存空间为16+字符串的长度
接着,String类在新增字符时,会创建新的临时对象。而其他三类正是因为可变的特性,所以可以直接修改char[]数组
所以不会创建新的临时对象来存值。
StringBuilder ,StringBuffer,StringJoiner ,三个类都继承自AbstractStringBuilder,实现的接口也一致。
StringBuilder的线程安全较差,但它的性能优越。而StringBuffer的性能较低,但它的线程安全较高,它的方法被
synchronized关键字修饰,所以较为安全。但现在很少使用到StringBuffer类,更多使用的是StringBuilder。
StringBuilder支持链式操作
StringJoiner类是一个可以高效拼接字符串的类。
// 代码实例
StringBuilder sbx = new StringBuilder(1024);
for (int i = 0; i < 1000; i++) {
sb.append(‘,’);
sb.append(i);
}
String s = sb.toString();
System.out.println(s);
StringBuilder链式操作
StringBuilder sb = new StringBuilder(1024);
sb.append(“Mr “)
.append(“Bob”)
.append(“!”)
.insert(0, “Hello, “);
System.out.println(sb.toString());
// StringBuilder与String类中不同的 方法
StringBuilder sb = new StringBuilder
sb.append(b);// 在sb字符串的后边拼接一个字符串。
sb.charAt(index);// 输出字符串sb下标为index的值
sb.delete(start, end);// 删除字符串从start开始,从end结束不包含end
sb.indexOf(str);// 查找字符串str在sb字符串中的位置,返回下标值
sb.reverse();// 将字符串逆序
sb.replace(start, end, str); // 替换字符串中的值,从start开始在end结束不包含end,替换为str