String、StringBuffer、StringBuilder 的区别
String、StringBuffer、StringBuilder 的区别
String 的特点
String 可以说是我们平时开发中接触最多,也使用最多的类之一,String 类提供了构造和管理字符串的各种基本逻辑。它被声明为 final class,这表明 String 是一个不可变类,其他人不可以继承 String 对 String 的属性进行修改,并且 String 中所有的属性也都是 final 的。
由于 String 的不可变性,一般的拼接、截取字符串等操作,不会对原有的 String 对象进行修改,都会在内存中产生新的 String 对象。由于字符串操作往往都比较普遍,所以相关操作的效率往往对性能有明显的影响。
StringBuffer 的特点
StringBuffer 的诞生,是在 JDK 1.5 之后,为了解决 String 在拼接过程中,产生太多中间对象的问题而出现的,提供的一个类,在使用 StringBuffer 的过程中,我们可以用 append() 或者 add()方法,把字符串添加到已有字符串的末尾或者指定位置。
StringBuffer 本质是一个线程安全的可修改字符数组,在保证了线程安全的同时,也带来了锁同步额外的性能开销,除非有线程安全的使用场景,一般情况下还是使用 StringBuilder 更好,相对来说效率也更高。
StringBuilder
StringBuilder 在底层和实际使用上和 StringBuffer 没有太大区别,并且底层使用的数据存储结构也都是一样的,不同的是 StringBuilder 非线程安全,在 StringBuilder 内部的方法中去掉了线程安全的修饰,所以在没有线程竞争产生线程不安全的场景下,StringBuilder 的效率和开销都是更优于 StringBuffer 的,实际开发中的使用率也很高。
总结
String 是 不可变类的典型实现,基于底层的数据存储保证了基础线程安全,无法底层的内部数据进行修改。
StringBuffer 的线程安全是通过把各种修改数据的方法都加上 synchronized 关键字实现的。
StringBuilder 的底层基本上和 StringBuffer 一样,只是方法上没有用 synchronized 修饰,底层都是可修改的 byte 数组。
版权声明: 本文为 InfoQ 作者【zarmnosaj】的原创文章。
原文链接:【http://xie.infoq.cn/article/67b386a48bf136821df3a0f95】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论