面试刷题5:String StringBuffer StringBuilder区别?

image.png

字符串是应用中最普遍的存在,不容忽视。java

我是李福春,我在准备面试,今天咱们一块儿来回答问题。面试

String,StringBuffer,StringBuilder的区别是什么?数组

很是常见的面试题,一块儿来发散一下。缓存

String

Java中最重要的类,提供了各类构造和管理字符串的操做;
它是Immutable类,即不可变,原生的保证了线程安全;
她的构造和各类操做都会产生一个新的String对象;因此要考虑内存和垃圾回收问题;安全

StringBuffer

线程安全的,为了解决String的操做产生不少中间String对象的问题。继承自AbstractStringBudiler,同步方法是在对应的操做方法中简单粗暴的加上syncronized关键字。数据结构

虽然不产生新的中间String对象,可是内部有一个数组负责存储,提早设置合理大小能够避免数组扩容引发的性能损耗。jvm

StringBuilder

同StringBuffer,不过是线程非安全的。性能

java8底层已经把字符串的+操做自动转换为StringBuilder的拼接操做;优化

字符串缓存

把jvm的堆转储,(dump heap)发现半数是重复的,若是能够避免重复的字符串,能够有效下降内存消耗和对象建立开销。ui

能够经过jvm的参数设置缓存池的大小 -XX:StringTableSize=x

intern是一种显示的排重机制,可是不推荐使用;

最新的jdk8,使用G1 GC,指定字符串排重参数能够达到底层去重的效果:

-XX:+UseStringDedumplication

其它字符串的底层优化

好比使用本地内联方法的intrinsic机制来优化字符串的操做速度;

改变StringBuilder的存储的数据结构为Compact Strings提升存储效率;

小结

本篇简单的回答了String,StringBuffer,StringBuilder的区别。
而后分析了StringBuffer,StringBuilder底层代码,提出来提早设置大小的优化建议;

字符串缓存是提升存储效率的中重要途径,最好使用jvm的参数进行调优。

image.png

原创不易,转载请注明出处,欢迎沟通交流。
相关文章
相关标签/搜索