Java intern Strings是否在for-each循环中

时间:2016-08-09 15:09:01

标签: java loops memory string-interning

我已经阅读了有关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开销限制。在这种情况下,性能和速度对我来说并非非常重要。

1 个答案:

答案 0 :(得分:2)

在这里明确调用intern()是正确的方法(或者像PC luddite所说,检查你是否真的需要实习)。我不知道JVM中的任何JIT编译器都是这样做的(即使有一些优化可以做到这一点,你也不应该依赖它)。

如果一个数组是从interned字符串创建的,然后传递给一个方法然后使用,那么&#34; interned&#34;将使用字符串。不会创建其他字符串。