博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试刷题5:String StringBuffer StringBuilder区别?
阅读量:4210 次
发布时间:2019-05-26

本文共 913 字,大约阅读时间需要 3 分钟。

image.png

字符串是应用中最广泛的存在,不容忽视。

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

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

非常常见的面试题,一起来发散一下。

String

Java中最重要的类,提供了各种构造和管理字符串的操作;

它是Immutable类,即不可变,原生的保证了线程安全;
她的构造和各种操作都会产生一个新的String对象;所以要考虑内存和垃圾回收问题;

StringBuffer

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

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

StringBuilder

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

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

字符串缓存

把jvm的堆转储,(dump heap)发现半数是重复的,如果可以避免重复的字符串,可以有效降低内存消耗和对象创建开销。

可以通过jvm的参数设置缓存池的大小 -XX:StringTableSize=x

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

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

-XX:+UseStringDedumplication

其它字符串的底层优化

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

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

小结

本篇简单的回答了String,StringBuffer,StringBuilder的区别。

然后分析了StringBuffer,StringBuilder底层代码,提出来提前设置大小的优化建议;

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

image.png

原创不易,转载请注明出处,欢迎多沟通交流

你可能感兴趣的文章
Linux学习记录--文件|目录的默认权限与隐藏权限
查看>>
Linux学习记录--命令与文件的查询
查看>>
Linux命令缩写
查看>>
Linux学习记录--文件系统简介
查看>>
Linux学习记录--文件系统简单操作
查看>>
Linux学习记录--磁盘分区,格式化与检验
查看>>
Linux学习记录--磁盘挂载与卸载
查看>>
Linux学习记录--内存交换空间的构建
查看>>
Linux学习记录--文件压缩
查看>>
Linux学习记录--文件备份|还原
查看>>
ASCII、ANSI、Unicode及UTF-8编码
查看>>
Unicode,ANSI,UTF-8的故事
查看>>
ANSI、Unicode、UTF-8、DBCS等字符集及相关数据类型、函数的区别
查看>>
Linux学习记录--vim与vi常用命令
查看>>
Linux学习记录--shell介绍
查看>>
Linux学习记录--shell变量
查看>>
Linux学习记录--命名别名与历史命令
查看>>
Linux学习记录--数据流重定向
查看>>
Linux学习记录--管道命令
查看>>
Linux学习记录--正则表达式与其应用
查看>>