java - 为什么说String的拼接会产生很多的无用对象呢?
问题描述
为什么说String的拼接会产生很多的无用对象呢?
eg.
String str = "";
while(true){
str +="abc";
}
按我的理解,字符串拼接只会在常量池中创建共享对象,常量池的对象会被垃圾回收器回收吗?为什么说会产生很多无用的对象,需要垃圾回收,从而影响程序性能呢?
对于楼主所说的字符串拼接只会在常量池中创建共享对象这句话,我没有理解具体指的是什么,但是我可以解释下这种写法为什么会产生很多无用对象,希望对楼主有所帮助。
以下为答案:
先看上图,JDK中String类为final类,用来存放String字符的value也是final!
这就说明string对象在创建完成后value值就已经无法再修改了!故此每一次循环产生的字符串肯定都是新的String对象。但是上述这段代码中产生的对象比你想象中的还要多!please继续看图!
----------------------靓丽的分割线-----------------------------
第二张图红框内即为第一张红框内的反编译代码。从图中可以见得:
a+=a;做了以下事情:
调用String.valueOf(a),这一步因为a也是字符串所以不会产生新的对象。
new StringBulid(第一部的对象其实就是字符串a),这一步会产生一个Stringbuild对象。
.append(被添加的字符串)
.toString(),这一步会调用Stringbuild的toString方法。
我们再看下Stringbuild的toString()源码
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
哎呀!怎么又创建了一个String对象啊!
到这里a+=a的解析就完成了,所以每一次循环内的字符串相加操作,其实都至少创建了一个StringBuild对象和一个String对象啊!
这篇关于java - 为什么说String的拼接会产生很多的无用对象呢?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!