StringBuffer和StringBuilder
StringBuffer和StringBuilder
String类是保存字符串常量的。每次更新都需要重新开辟空间,效率较低,由此StringBuilder和 StringBuffer 就被设计出来增强String的功能,以提高效率。
StringBuffer
基本介绍
- StringBuffer 的直接父类 是 AbstractStringBuilder
- StringBuffer 实现了 Serializable, 即 StringBuffer 的对象可以串行化
- 在父类中 AbstractStringBuilder 有属性 char[] value,不是 final
该 value 数组存放 字符串内容,引出存放在堆中的 - StringBuffer 是一个 final 类,不能被继承
- 因为 StringBuffer 字符内容是存在 char[] value, 所有在变化(增加/删除)
不用每次都更换地址(即不是每次创建新对象), 所以效率高
String VS StringBuffer
- String保存的字符串常量,里面的值不能被修改,每次更新就是修改地址,效率低。
private final char value[] - StringBuffer保存的是字符串变量,里面的值可以修改,每次更新就是在更新内容,不必更新地址,效率高 char[] value 这个放在堆。
String 和StringBuffer相互转换
public static void main(String[] args) {
//看 String——>StringBuffer
String str = "hello tom";
//方式 1 使用构造器
//注意: 返回的才是 StringBuffer 对象,对 str 本身没有影响
StringBuffer sb = new StringBuffer(str);
//方式 2 使用的是 append 方法
StringBuffer sb1 = new StringBuffer();
sb1 = sb1.append(str);
//看看 StringBuffer ->String
StringBuffer sb3 = new StringBuffer("zbc");
//方式 1 使用 StringBuffer 提供的 toString 方法
String s = sb3.toString();
//方式 2: 使用构造器来搞定
String s1 = new String(sb3);
}
StringBuffer类常用方法
- append 增加
- delete 删 s.delete(2,5) 这里删除的是索引[2, 5)左闭右开,也就是索引2,3,4三个字符
- replace 改 s.replace(2, 5, "那必须是我了") 这里同样[2, 5),把索引2-4三个替换成"那必须是我了"
- indexOf 查,查询指定子串在字符串第一次出现的索引,找不到返回-1
- insert 插入 s.insert(9, "就这?") 这里是在索引9前位置插入字符串"就这?"
- length 长度 显示字符串长度,很常见。
StringBuilder
可变的字符序列,提供与StringBuffer兼容的API,但不保证同步(StringBuilder不是线程安全)。该类是StringBuffer的简易替换,用于字符串缓冲区被翻个线程使用的时候。尽可能的情况下多用此类,因为它,快。
StringBuilder主要操作是append和insert方法,可以重载这些方法接受任意类型的数据
基本介绍
-
StringBuilder 继承 AbstractStringBuilder 类
-
实现了 Serializable ,说明 StringBuilder 对象是可以串行化(对象可以网络传输,可以保存到文件)
-
StringBuilder 是 final 类, 不能被继承
-
StringBuilder 对象字符序列仍然是存放在其父类 AbstractStringBuilder 的 char[] value;
因此,字符序列是堆中 -
StringBuilder 的方法,没有做互斥的处理,即没有 synchronized 关键字,因此在单线程的情况下使用StringBuilde
StringBuilder常用方法
StringBuilder和StringBuffer都是代表可变字符序列,方法都是一样的,所以使用相同
String、StringBuffer 和 StringBuilder
比较
-
StringBuilder和 StringBuffer非常类似,均代表可变的字符序列,而且方法也一样
-
String:不可变字符序列,效率低,但是复用率高。
-
StringBuffer:可变字符序列、效率较高(增删)、线程安全,看源码
-
StringBuilder:可变字符序列、效率最高、线程不安全
-
String使用注意说明:
string s="a";//创建了一个字符串
s += "b";//实际上原来的"a"字符串对象已经丢弃了,现在又产生了一个字符串s+"b”(也就是"ab")。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大,影响程序的性能=>结论:如果我们对String做大量修改,不要使用String
选择
使用的原则,结论:
-
如果字符串存在大量的修改操作,一般使用 StringBuffer 或StringBuilder
-
如果字符串存在大量的修改操作,并在单线程的情况,使用 StringBuilder
-
如果字符串存在大量的修改操作,并在多线程的情况,使用 StringBuffer
-
如果我们字符串很少修改,被多个对象引用,使用String,比如配置信息等