gpt4 book ai didi

java - 使用双引号生成的字符串未在字符串池中生成

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:53:27 27 4
gpt4 key购买 nike

我正在尝试执行以下代码行。我的理解是#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 情况下的堆转储对象屏幕截图

string

最佳答案

如果你创建了一个 String 而没有驻留它,它只会进入堆。所以可以有多个相同字符串的副本。如果你 intern 字符串,每个相等类将只有一个字符串。

为相同的 j 多次创建字符串 "String"+ j 会在不驻留字符串的情况下消耗更多的内存。

驻留可以节省内存,但它也会降低程序速度,因为每个字符串都保存在某种 HashSet 中,创建一个字符串意味着查找它是否已经存在于该 HashSet 中。

注意:有些字符串会自动驻留,例如源代码中的字符串文字。

关于java - 使用双引号生成的字符串未在字符串池中生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37943392/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com