java - 为什么说String的拼接会产生很多的无用对象呢?
高洛峰
高洛峰 2017-04-18 10:49:32
[Java讨论组]

为什么说String的拼接会产生很多的无用对象呢?
eg.
String str = "";
while(true){

str +="abc";

}

按我的理解,字符串拼接只会在常量池中创建共享对象,常量池的对象会被垃圾回收器回收吗?为什么说会产生很多无用的对象,需要垃圾回收,从而影响程序性能呢?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(2)
天蓬老师

String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。

经常修改的变量 要用StringBuffer 奥~

高洛峰

...jdk1.8之后才字符串的多次拼接才会使用StringBuild 把。。老版本不是这样的把!~~
我上次看了一片文章0 0,不知道有没有错。
1.8以前需要String的多次修改需要使用StringBuffer或者StringBuilder。
1.8启用了 语法糖修改了这一块,让我们不用显式调用StringBuilder 即可享用高效。

还有你对string只会在常量池中创建共享对象,

str +="abc";
1.abc
2.abcabc
3........

难道这创建的每一个不都是无用的对象么?除了最后的结果,GC的回收也是需要时间的把。

因为string则是因为final修饰char[ ]的原因,每次都要创建新的对象,
而StringBuilder这类是这所以的高效的原因是数组动态扩容把,一般是添加操作把,只有容量满了才创建新的更大的char[],将旧数据拷贝之后再添加,综上stringbuilder减少了对象的生成把,不用每次都要生成新的对象。敬请大牛拍砖指导!~!~!~

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号