Collections.unmodifiableMap可以保留原图吗?
Can Collections.unmodifiableMap retain the original map?
我有一段代码如下:
class Util {
private static final Map<String, String> MY_MAP;
static {
Map<String, String> tmpMap = new TreeMap<String, String>();
tmpMap.put("key1", "val1");
tmpMap.put("key2", "val2");
tmpMap.put("key3", "val3");
MY_MAP = Collections.unmodifiableMap(tmpMap);
}
public static String getVal(String key) {
return MY_MAP.get(key);
}
}
MY_MAP 可以一直保留 tmpMap 吗?或者换句话说,GC 是否有可能回收使 MY_MAP 无法访问的 tmpMap?
返回的 Map 只是一个 "view" 环绕传入的 Map。
所以是的,只要 MY_MAP
还活着,tmpMap
就会保留。由于 MY_MAP
是一个 static final
字段,因此 tmpMap
将被保留 basically forever。
Returns an unmodifiable view of the specified map. [...] Query operations on the returned map "read through" to the specified map [...].
Or in other words, is it possible that the GC will recycle the tmpMap which makes the MY_MAP inaccessible?
不,从来没有。 MY_MAP
具有对 tmpMap
的(强)引用,因此无法收集。
一般来说,GC 绝不会做这样的事情。你永远不会看到它工作,除非在特殊情况下(WeakHashMap
和类似)。
我有一段代码如下:
class Util {
private static final Map<String, String> MY_MAP;
static {
Map<String, String> tmpMap = new TreeMap<String, String>();
tmpMap.put("key1", "val1");
tmpMap.put("key2", "val2");
tmpMap.put("key3", "val3");
MY_MAP = Collections.unmodifiableMap(tmpMap);
}
public static String getVal(String key) {
return MY_MAP.get(key);
}
}
MY_MAP 可以一直保留 tmpMap 吗?或者换句话说,GC 是否有可能回收使 MY_MAP 无法访问的 tmpMap?
返回的 Map 只是一个 "view" 环绕传入的 Map。
所以是的,只要 MY_MAP
还活着,tmpMap
就会保留。由于 MY_MAP
是一个 static final
字段,因此 tmpMap
将被保留 basically forever。
Returns an unmodifiable view of the specified map. [...] Query operations on the returned map "read through" to the specified map [...].
Or in other words, is it possible that the GC will recycle the tmpMap which makes the MY_MAP inaccessible?
不,从来没有。 MY_MAP
具有对 tmpMap
的(强)引用,因此无法收集。
一般来说,GC 绝不会做这样的事情。你永远不会看到它工作,除非在特殊情况下(WeakHashMap
和类似)。