我已经阅读了有关SO的问题,解释说Java会自动插入字符串文字,并且在调用intern()
时显然是实习生。但是,我想知道是否在循环中(在我的情况下为foreach
循环)字符串也会自动实现。我问,因为我正在实习字符串,以便在几个非常大的LinkedHashMaps
中保存内存,并想知道调用intern()
是否是多余的。
示例:
String array[] = createLargeArbitraryArray();
Map<String, Float> map = new LinkedHashMap<String, Float>(array.length);
for (String s : array)
map.put(s, 1f);
}
下一个示例的内存使用量是否与第一个示例有任何差异(假设array
值相同),或者s
是否已在该点实现了内容?
String array[] = createLargeArbitraryArray();
Map<String, Float> map = new LinkedHashMap<String, Float>(array.length);
for (String s : array)
map.put(s.intern(), 1f);
}
我意识到在这种情况下,可能没有等效的字符串,但在我的情况下,我有几个地图的自定义键,最后使用重复的字符串值,我想知道是否调用intern()
在这一点上节省内存是多余的。
要添加到这个问题,如果一个数组是从文字创建的(在这种情况下它们最初被实现),然后作为参数传递给一个方法,上面的循环是否会使用实际的字符串?即:
/**
* @param array created from literals
*/
public void populateMap(String[] array) {
for (String s : array)
map.put(s, 1f); // Interned or not?
}
在这种情况下,要么s
被拦截,因为array
被开始实习,或者s
没有被实习,因为它被声明为循环参数中的新对象。哪个是对的?
编辑:为了进一步解释我实习的原因,我想释放堆中的内存,以避免达到最大堆大小或GC开销限制。在这种情况下,性能和速度对我来说并非非常重要。
答案 0 :(得分:2)
在这里明确调用intern()
是正确的方法(或者像PC luddite所说,检查你是否真的需要实习)。我不知道JVM中的任何JIT编译器都是这样做的(即使有一些优化可以做到这一点,你也不应该依赖它)。
如果一个数组是从interned字符串创建的,然后传递给一个方法然后使用,那么&#34; interned&#34;将使用字符串。不会创建其他字符串。