1.String, StringBuffer , StringBuilder区别
1.1 长度是否可变
String 不可变
StringBuffer 和 StringBuilder 可变
1.2 是否线程安全
String 不可变,因此是线程安全的
StringBuilder 不是线程安全的
StringBuffer 是线程安全的,内部使用 synchronized 来同步
在stackoverflow 上大神的回答如下:
大概的意思:
可变性差异:
String
是不可变的,如果你试图改变它们的值,那么另一个对象被创建,StringBuffer
和StringBuilder
是可变的,所以他们可以改变它们的值。
线程安全差异:
StringBuffer
和StringBuilder之间的差异
在于是否是线程安全的。所以当应用程序只需要在单个线程中运行时,最好使用它StringBuilder
。StringBuilder
比StringBuffer更有效率。
2.String 字符串为什么不可变
2.1 可以缓存 hash 值
因为 String 的 hash 值经常被使用,例如 String 用做 HashMap 的 key。不可变的特性可以使得 hash 值也不可变,因此只需要进行一次计算。
2.2 String Pool 的需要
如果一个 String 对象已经被创建过了,那么就会从 String Pool 中取得引用。只有 String 是不可变的,才可能使用 String Pool。2.3. 安全性
String 经常作为参数,String 不可变性可以保证参数不可变。例如在作为网络连接参数的情况下如果 String 是可变的,那么在网络连接过程中,String 被改变,改变 String 对象的那一方以为现在连接的是其它主机,而实际情况却不一定是。2.4. 线程安全
String 不可变性天生具备线程安全,可以在多个线程中安全地使用。