String、StringBuilder、StringBuffer区别
总结
- String的值是final,不可变的,每次操作String都会生成新的String对象,不仅效率低,而且浪费大量的内存空间
- StringBuffer 和 StringBuiler 都是继承 AbstractStringBuilder 类,
- StringBuffer 重写了 AbstractStringBuilder 的所有操作方法 加上了 synchronized 关键字 和 toStringCache 缓冲区 ,使得StringBuffer所有操作方法变为了同步方法,变为了线程安全的字符串操作类,字符数据未变化时,多次使用toString时可以直接获取缓存数据,toStringCache变量使用 transient 关键字修饰 ,不会被系列化;速度快
- StringBuilder 基本操作都是直接使用 AbstractStringBuilder 父类方法; 线程操作不安全 ,速度更快
字符串操作
-
String
String a = "123"; a = "456";
从代码就能看出,String 类型给变量赋值实际上是重新创建了一个对象String
-
StringBuffer
StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("123"); private transient String toStringCache; public synchronized StringBuffer append(String str) { toStringCache = null; super.append(str); return this; }
StringBuffer内部调用的实际上 是父类 AbstractStringBuilder 中的append 方法, 直接对char[] 操作。只是在此基础上 增加了 synchronized 关键字 和 toStringCache 缓冲区的操作
toStringCache 缓冲区 也只是用在toString() 方法上面
public synchronized String toString() { if (toStringCache == null) { return toStringCache = isLatin1() ? StringLatin1.newString(value, 0, count) : StringUTF16.newString(value, 0, count); } return new String(toStringCache); }
-
StringBuilder
StringBuilder stber = new StringBuilder(); stber.append("123"); public StringBuilder append(String str) { super.append(str); return this; }
StringBuilder内部调用的实际也上 是父类 AbstractStringBuilder 中的append, 直接对char[] 操作。并且没有 synchronized 关键字 也没有 toStringCache 缓冲区