Java中Hashmaps的可变性

时间:2014-06-04 11:18:05

标签: java

我正在尝试构建HashMaps的巨型HashMap。我遇到了可变性问题,我不断修改已经添加到地图中的元素。我结束了使用这种方法,虽然它确实应该想知道可能有更好的方法来做到这一点

public class Main {

    public static void main(String[] args) {
        HashMap<String, HashMap<String, String>> map = new HashMap<String, HashMap<String, String>>();
        HashMap<String, String> s = null;

        // process 1
        s = new HashMap<>();
        s.put("foo", "bar");
        s.put("foo1", "bar");
        s.put("foo2", "bar");
        s.put("foo3", "bar");
        map.put("m1", (HashMap<String, String>) s.clone());

        // process 2
        s = new HashMap<>();
        s.put("9", "bar");
        s.put("10", "bar");
        s.put("11", "bar");
        s.put("12", "bar");
        map.put("m2", (HashMap<String, String>) s.clone());

        // process 3
        s = new HashMap<>();
        s.put("99", "bar");
        s.put("103", "bar");
        s.put("112", "bar");
        s.put("121", "bar");
        map.put("m3", (HashMap<String, String>) s.clone());

        for (Map.Entry<String, HashMap<String, String>> entry : map.entrySet()) {
            String key = entry.getKey();
            HashMap<String, String> value = entry.getValue();
            System.out.print("");
            // ...
        }
    }

}

1 个答案:

答案 0 :(得分:1)

由于您为每个内部引用创建了新的HashMap,因此无需clone它。你在这里做的只是将一个新对象放到引用中:

s = new HashMap<>();

因此,简而言之,您创建此方式的每个HashMap将是一个不同的对象,s变量包含对您正在使用的当前变量的引用。