Java中String、StringBuffer及StringBuilder的区别

最近在reviews公司项目代码的时候,发现自己三个月前写的代码效率不高,所以都一一去优化,在优化到部分涉及到字符串拼接的问题上时,发现自己以前都没注意到效率,都是String直接拼接,所以就研究下字符串拼接的效率。

String介绍

从官网介绍中可看到String是字符串常量,字符串长度不变,它是不可变的。
在使用String主要注意的几点:

  1. String类初始化后是不可变的
  2. 使用String不一定创建对象
  3. 使用new String,一定创建对象

StringBuffer介绍

从官网介绍中可看到StringBuffer是线程安全的可变字符序列,在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
操作上提供append和insert方法,append方法是将字符添加到缓冲区的末端,而insert方法则能在指定的点添加字符。

StringBuilder介绍

从官方介绍知道StringBuilder是一个可变的字符序列,线程是不安全的,速度相较于StringBuffer要更快些。

使用

  1. 如果要操作少量的数据,用String;
  2. 单线程操作大量数据,用StringBuilder;
  3. 多线程操作大量数据,用StringBuffer;
  4. 不要使用String的“+”来进行多次拼接,因为性能很差,应该使用StringBuffer或StringBuilder类;
  5. 为了获得更好的性能,在构造StringBuffer或StringBuilder时应尽可能指定它们的容量,默认构造容量为16个字符;
  6. StringBuilder使用在方法内部来完成类似“+”功能,因为是线程不安全的,所以用完以后可以丢弃掉,StringBuffer主要用在全局变量中;

区别

  1. 可变与不可变
    String类中使用字符数组保存字符串,private final char value[]中因为有‘final’修饰符,所以String对象是不可变的。
    StringBuilder与StringBuffer都继承AbstractStringBuilder类,char[] value可见在AbstractStringBuilder中也是使用字符数组保存字符串,所以这两种对象都是可变的。
  2. 是否多线程安全
    String中的对象是不可变的,显然线程安全。
    StringBuffer对方法加了同步锁,所以是线程安全。
    StringBuilder并没有对方法进行加同步锁,所以是非线程安全。
  3. StringBuilder与StringBuffer共同点
    StringBuilder与StringBuffer同继承AbstractStringBuilder。共同有公共方法,只是StringBuffer会在方法上加synchronized进行同步。
    如果程序不是多线程的,使用StringBuilder效率高于StringBuffer。
坚持原创技术分享,您的支持将鼓励我继续创作!