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

unmodifiableMap:

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 和类似)。