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减少同步锁的开销

你可能感兴趣的:(String StringBuffer StringBuilder的区别)