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

主要从三个方面谈这三个类的区别:

  • 可变性
  • 线程安全性
  • 性能

可变性

String为什么是不可变的?
String内部实现其实是private final char value[], 所以String对象是不可变的.

StringBuilder与StringBuffer都继承自AbstractStringBuilder类.
AbstractStringBuilder是用char[] value来存储字符串的, 但是没有用final关键字, 所以StringBuilder和StringBuffer对象都是可变的.

线程安全性

String中的对象是不可变的, 可以理解成常量, 是线程安全的.

AbstractStringBuilder是StringBuilder和StringBuffer的公共父类, 定义了一些字符串的操作方法, 如常用的append用于字符串拼接, indexOf用于字符串查找等.

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

而StringBuilder并没有对方法家同步锁, 所以是非线程安全的.

性能

对于String对象而言, 每次都会生成一个新的String对象, 然后将指针指向新的String对象.

StringBuffer和StringBuilder每次都会对对象本身进行操作, 而不是生成新的对象并且改变对象的引用. 相同情况下使用StringBuilder会比StringBuffer获得10%-15%的性能提升, 但是要承担多线程不安全的风险.

总结

少量数据用String
单线程大量数据用StringBuilder
多线程大量数据用StringBuffer

你可能感兴趣的:(String,StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?)