java - 为什么说String的拼接会产生很多的无用对象呢?

查看:209
本文介绍了java - 为什么说String的拼接会产生很多的无用对象呢?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

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

str +="abc";

}

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

解决方案

对于楼主所说的字符串拼接只会在常量池中创建共享对象这句话,我没有理解具体指的是什么,但是我可以解释下这种写法为什么会产生很多无用对象,希望对楼主有所帮助。

以下为答案:

先看上图,JDK中String类为final类,用来存放String字符的value也是final!

这就说明string对象在创建完成后value值就已经无法再修改了!故此每一次循环产生的字符串肯定都是新的String对象。但是上述这段代码中产生的对象比你想象中的还要多!please继续看图!

----------------------靓丽的分割线-----------------------------

第二张图红框内即为第一张红框内的反编译代码。从图中可以见得:
a+=a;做了以下事情:

  1. 调用String.valueOf(a),这一步因为a也是字符串所以不会产生新的对象。

  2. new StringBulid(第一部的对象其实就是字符串a),这一步会产生一个Stringbuild对象。

  3. .append(被添加的字符串)

  4. .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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆