【发布时间】:2015-08-15 01:02:04
【问题描述】:
我明白,考虑到字符串的不变性,像
String a="";
for(int i=0;i++<9;)
a+=i;
效率非常低,因为最初实例化一个字符串并将其放入 字符串池,然后使用a+=i 创建一个新字符串(在第一个循环中 0 ),由a 引用,前一个现在可以进行垃圾收集。这种情况发生了九次。
更好的方法是使用StringBuilder:
StringBuilder a=new StringBuilder("");
for(int i=0;i++<9;)
a.append(i);
但是当我用
new关键字?
String a=new String("");
for(int i=0;i++<9;)
a+=i;
我知道在这种情况下a 不会被实习(它不在字符串池中),但它仍然是不可变的吗?这个时候a+=i指令做了什么?行为是否与我的第一个示例相同?
【问题讨论】:
-
是什么让你认为在你的第一个版本中所有的字符串都放在了池中?只有空字符串会在字符串池中......其余的只会在堆上。是的,所有字符串都是不可变的,无论它们是否来自常量池。
-
@JonSkeet 感谢您的澄清......我有点困惑
标签: java string stringbuilder string-pool