Collections.unmodifiableMap可以保留原始地图吗?

时间:2015-05-11 01:32:49

标签: java dictionary garbage-collection unmodifiable

我在下面有一段代码:

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?

2 个答案:

答案 0 :(得分:3)

返回的地图只是一个“视图”,它包裹着传入的地图。

是的,只要#include <iostream> //(Normally formatted correctly running into error when posting #include <cmath> #include <fstream> #include <string> #include <iomanip> #include <sstream> #include <string> #include <stdio.h> #include <string.h> #include <algorithm> void search(int ab[], int number_used, int target); using namespace std; stringstream ss; int main() { int a=97; int b=98; int c=99; int d=100; int e=101; int f=102; int g=103; int h=104; int i=105; int j=106; int k=107; int l=108; int m=109; int n=110; int o=111; int p=112; int q=113; int r=114; int s=115; int t=116; int u=117; int v=118; int w=119; int x=120; int y=121; int z=122; char number_1[432]; cout << "Enter text:\n"; cin >> number_1; long xb; xb=strlen(number_1); long ci=0; int bruh[xb]; for (long bi=0; bi<xb; bi++) { bruh[bi]=number_1[bi]; } sort(bruh, bruh+xb); search(bruh,xb,a); } void search(const int ab[], int number_used, int target) { int a=97; int b=98; int c=99; int d=100; int e=101; int f=102; int g=103; int h=104; int i=105; int j=106; int k=107; int l=108; int m=109; int n=110; int o=111; int p=112; int q=113; int r=114; int s=115; int t=116; int u=117; int v=118; int w=119; int x=120; int y=121; int z=122; int index=0; int count=0; bool found=false; while ((!found) && (index < number_used)) { if(target==ab[index]) { found=true; count++; index++; } else { index++; } } if (count>0) { } } 还活着,tmpMap就会被保留。由于MY_MAPMY_MAP字段,static final将被保留basically forever

unmodifiableMap

  

返回指定地图的不可修改视图。 [...]对返回的地图上的查询操作“通读”到指定的地图[...]。

答案 1 :(得分:3)

  

或者换句话说,GC是否可能会回收使得MY_MAP无法访问的tmpMap?

不,永远不会。 MY_MAPtmpMap有一个(强烈)引用,因此无法收集。

一般情况下,GC绝不会做这样的事情。除了特殊情况(WeakHashMap和类似情况)之外,你永远不会看到它有效。