产生双引号,我尝试执行下面的代码行生成。我的理解是#1和#2都应该在字符串池中生成字符串,因此在执行过程中不应该有任何区别,但是当我分析堆转储时,如果在字符串池中生成intern()字符串(可以通过有限数量的字符串对象来解释),但是在堆上生成#1字符串的情况下(因为堆转储中存在大量字符串对象),并且系统比以前的情况快。有人可以解释为什么它是这样吗?我正在使用Java 6来执行下面的代码行。万一字符串中使用没有得到的字符串池
import java.util.LinkedList;
public class LotsOfStrings {
private static final LinkedList<String> LOTS_OF_STRINGS = new LinkedList<String>();
public static void main(String[] args) throws Exception {
int iteration = 0;
while (true) {
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 1000; j++) {
String s= "String " + j;
LOTS_OF_STRINGS.add(s); // #1
//LOTS_OF_STRINGS.add(new String("String " + j).intern()); //#2
}
}
iteration++;
System.out.println("Survived Iteration: " + iteration);
Thread.sleep(100);
}
}
堆转储对象的截图,如果在的情况下,实习生 intern
堆转储对象截图#1
字符串仅当它的可用池接到一个字符串池参考否则其创造堆的字符串。 – Nir
在内环它应产生的第一执行1000唯一字符串字符串0 .... ....到字符串999。在此之后,应在内部循环的所有后续执行作为第一字符串执行期间创建的不是程序使用的参考参考应该在字符串池中可用? – Vyas