Clear 方法删除所有 Hashmap 对象中的所有链接

Clear method removes all links in all Hashmap's objects

当我清理内部地图时看到这一点时,我很震惊,之前将它添加到外部地图。有什么方法可以重置内部地图但不从外部地图中删除对象?

主要class:

public static void main(String args[]) {
        Person per1 = new Person("1", "aaa",56, true);
        Person per2 = new Person("20", "bbb",34, false);

        Map<Integer, Map<Integer, Person>> outer = new HashMap<Integer, Map<Integer, Person>>();

        Map<Integer, Person> inner = new HashMap<Integer, Person>();

        inner.put(100, per1);
        inner.put(200, per2);

        outer.put(1000, inner);
        // inner: size = 2 , outer: size = 1 (key = 1000, value size = 2)
        inner.clear();
        // inner: size = 0 , outer: size = 1 (key = 1000, value size = 0) 
        // why outer value size = 0 ?
}

人:

public class Person {
    private String id;
    private String name;
    private int age;
    private boolean isSome;


    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public boolean isSome() {
        return isSome;
    }

    public void setSome(boolean isPaid) {
        this.isSome = isPaid;
    }
    public Person(){}

    public Person(String id, String name, int age, boolean isSome){
        this.id = id;
        this.name = name;
        this.age = age;
        this.isSome = isSome;
    }
}

outer.put(1000, inner);inner 变量中包含的引用作为值放在外部 Map 中。它不会创建 inner 引用的实例的副本,因此如果您稍后清除 inner 映射,您也会清除存储在外部映射中的值。

如果你希望外层Map的值是原始内层Map的副本,你可以创建一个新实例:

outer.put(1000, new HashMap<Integer, Person>(inner));

请注意,在这种情况下,新内部 Map 中的 Person 个实例将与原始 inner Map 的原始 Person 个实例相同,因此如果您改变其中之一,存储在 Map 中的实例也会发生变异。