String为什么是不可变的? String、StringBuffer 和 StringBuilder 的区别是什么?

String为什么是不可变的?

String 类中使用 final 关键字修饰字符数组来保存字符串, private final char value[], 所以String对象是不可变的.


String、StringBuffer 和 StringBuilder 的区别是什么?

可变性

String 类中使用 final 关键字修饰字符数组来保存字符串, private final char value[], 所以String对象是不可变的. 而 StringBuilder 和 StringBuffer 都继承自 AbstractStringBuilder 类, 在 AbstractStringBuiler 中也是使用字符数组保存字符串 char[] value 但是没有使用 final 关键字修饰, 所以这两种对象都是可变的.

线程安全性

StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁, 所以是线程安全的. StringBuilder 并没有对方法加同步锁, 所以是线程不安全的.

性能

每次对 String 类型进行改变的时候, 都会生成一个新的 String 对象, 然后将指针指向新的 String 对象. StringBuffer, 每次都会对 StringBuffer 对象本身进行操作, 而不是生成新的对象并改变对象引用. 相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得少量的性能提升(性能提升只有在十万以上的数据量有体现, 但到了亿以上的时候两者又会相差不大), 但却要冒线程不安全的风险.

对于三者使用的总结

  • 操作少量的数据: String
  • 单线程操作字符串缓冲区下操作大量数据: StringBuilder
  • 多线程操作字符串缓冲区下操作大量数据: StringBuffer

猜你喜欢

转载自www.cnblogs.com/lk13227/p/13203438.html