首页 > 解决方案 > 当一个map变量传递给不同实例的构造函数时,所有实例的成员变量都会更新为map的最新值

问题描述

主课——

package test;
import java.util.Map;

public class Client {
    private static ArrayList<Class1> allInstances = new ArrayList<Class1>();
    private static Map <String, String> var1 = new HashMap<String, String>();

    public static void main(String[] args)
    {
        var1.put("key1","value1");
        Class1 instance1 = new Class1(var1);
        allInstances.add(instance1);

        var1.put("key2","value2");
        Class1 instance2 = new Class1(var1);
        allInstances.add(instance2);

        getInstances();
    }

    public static void getInstances() {
        for(Class1 c: allInstances) {
            System.out.println(c.getClassDetails());
    }
}

类 Class1 --

package test
import java.util.Map;

public class Class1 {
    private Map <String, String> classDetails;

    public Class1(Map <String, String> classDetails) {
        this.classDetails = classDetails;
    }

    public Map <String, String> getClassDetails(){
        return this.classDetails;
    }
}

输出 -

{key2=value2}
{key2=value2}

正如我们从上面的输出中看到的,两个实例变量都返回相同的更新值。不应该 instance1 返回 {key1=value1}

此外,如果这是预期的行为,可以采取什么措施来解决这个问题。

标签: java

解决方案


从您的代码中可以看出,您将相同的 HashMap 引用到 instacne1 和 instance2 对象,并且在getClassDetails方法tostring中将调用相同哈希图的方法,因此输出相同,请使用以下代码片段:

import java.util.*;

public class Main {
    private static ArrayList<Class1> allInstances = new ArrayList<Class1>();

    public static void main(String[] args)
    {
        Map <String, String> var = new HashMap<String, String>();
        var.put("key1","value1");
        Class1 instance1 = new Class1(var);
        allInstances.add(instance1);

        var = new HashMap<String, String>();
        var.put("key2","value2");
        Class1 instance2 = new Class1(var);
        allInstances.add(instance2);

        getInstances();
    }

    public static void getInstances() {
        for(Class1 c: allInstances) 
            System.out.println(c.getClassDetails());
    }
}

推荐阅读