3

我存储了大量相等的字符串。价值观不会经常改变。

由于string.intern()应该只返回引用,因此我将 1 亿个完全相同的字符串列表中的每一个都进行了实习,这些字符串存储在ArrayList.

我预计 Java 内存会大幅下降,但存储普通字符串与存储字符串显示的差异小于 0.1%。

我错过了什么还是这是预期的行为?

列表生成代码

    long max = 100000000;
    for(int i =0 ; i < max;i++ ){
        list.add("sometextelidedforbrevity".intern());
    }

内存使用量为 1 242 360 KB 和 1 242 184 KB。

4

2 回答 2

4

字符串文字会自动被实习。也就是说,表达式"sometextelidedforbrevity"将始终在运行时成为String已被实习的对象引用。调用intern()一个已经实习过的字符串实际上是一个空操作。

于 2013-03-21T19:07:12.720 回答
0

我使用的是字符串文字,我在文档中忽略了它,感谢 cdhowie 和 Russel Zahniser 在评论中的回答。

他们已经通过使用文字被拘留。

据我了解,让字符串不被实习的唯一方法是使用 new String()。

于 2013-03-21T19:07:03.967 回答