string.intern不会使用更少的内存

3
我已经存储了大量相同的字符串。这些值不会经常更改。
由于`string.intern()`应该只返回引用,因此我将一个包含100百万个完全相同的字符串的列表中的每个字符串都进行了intern处理,然后存储在一个`ArrayList`中。
我预期Java内存使用量会大幅下降,但是与普通字符串相比,存储interned字符串的差异小于0.1%。
我是否遗漏了什么?或者这是预期的行为?
代码生成列表如下:
    long max = 100000000;
    for(int i =0 ; i < max;i++ ){
        list.add("sometextelidedforbrevity".intern());
    }

没有使用的内存为1,242,360 KB,使用后为1,242,184 KB。


你是如何创建这些字符串的?给我们看看你的代码。它们可能已经被内部化了。 - cdhowie
4
你是使用字符串字面值还是new String()?因为字符串字面值会自动进行内部化... - Russell Zahniser
正在使用多少内存? - Aaron Kurtzhals
@cdhowie 编辑后的代码。 - Vort3x
就像上面的评论所说,因为您使用了字面字符串,所以您的字符串已经自动进行了内部化处理,因此占用相同的内存空间。 - Byron
2个回答

4

字符串文字自动进行内部化。也就是说,表达式"sometextelidedforbrevity"将始终在运行时变成一个已经被内部化的String对象引用。对已经被内部化的字符串调用intern()方法实际上没有任何作用。


0

我一直在使用字符串字面量,但是在文档中忽略了这一点,感谢cdhowie和Russel Zahniser在评论中提供的答案。

它们已经通过使用字面量被内部化了。

据我所知,唯一不会使字符串内部化的方法是使用new String()。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接