写点什么

String、StringBuffer、StringBuilder 的区别

作者:zarmnosaj
  • 2022 年 10 月 11 日
    四川
  • 本文字数:756 字

    阅读完需:约 2 分钟

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 数组。

发布于: 刚刚阅读数: 3
用户头像

zarmnosaj

关注

靡不有初,鲜克有终 2020.02.06 加入

成都后端混子

评论

发布
暂无评论
String、StringBuffer、StringBuilder的区别_10月月更_zarmnosaj_InfoQ写作社区