String StringBuffer StringBuilder的区别

工作1-3年的小伙伴应该碰到无数次的一道面试题:

“String StringBuffer StringBuilder的区别是什么”

String 我相信大家已经不陌生了,开发中应该都离不开操作字符串。等等一系列的操作与存储
理解String 底层原理对于项目优化起着很重要的作用。

首先大家都知道String 是被final 修饰的 所有属性也都是final 修饰的,保证了基础线程安全,因为你对他的内部数据无法进行修改。由于不可变在copy数据的时候不需要额外的复制数据,String的不可变设计也就是说在拼接、截断的过程当中,都会产生新的String对象

JAVA 在避免过多String 对象产生过多的时候,引入了字符串常量池。运行机制是:在生成String 对象的时候会去找常量池里面是否有相同字符串,如果有则把池子内的对象引用拿出来,如果没有那么会生成新的对象。以上说法只存在于直接给String 赋值的时候,那么使用new String() 则不会去判断池中是否会存在,则直接在堆和栈中生成新的引用和对象。

String a = "abc"
String b = new String("abc");

常量池的设计 可以节省同一字符串出现多次节省内存空间。
在项目过程中尽量的避免使用String与String的拼接,垃圾回收将会消费大量的时间与内存

接下来说到StringBuffer和StringBuilder
其实StringBuffer和StringBuilder 没有本质的区别,并且共同继承AbstractStringBuilder类
并且底层存储和String一样,都是一个char数组,但是不同的是他们的内容是可变的。
而它们的默认大小是16(JDK8)如果在字符串长度大于16的时候那么会进行扩容。
如果在开发当中能预估大小那么可以先预设char数组的长度,减少扩容的开销

大家可以去看源码,StringBuffer和StringBuilder 在方法和属性几乎一致,StringBuffer 所有方法都用到了synchronized修饰,多线程的情况下能保证线程安全问题。同时也体现StringBuffer的性能远低于StringBuilder
在单线程环境当中建议是使用StringBuilder减少同步锁的开销

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 废话不多说,自己进入今天的主题 1、面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽象:...
    传奇内服号阅读 2,511评论 1 31
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,816评论 18 399
  • String 的声明 由 JDK 中关于String的声明可以知道: 不同字符串可能共享同一个底层char数组,例...
    CodeKing2017阅读 1,743评论 1 2
  • 前言 RTFSC (Read the fucking source code )才是生活中最重要的。我们天天就是要...
    二毛_coder阅读 507评论 1 1
  • 今天我们来讲一点追高价值女生的思维。 那么说到高价值,有很多的方式可以去展示。而我今天要教给大家的,是一种高价值的...
    luke卢克阅读 308评论 0 0

友情链接更多精彩内容