当映射变量传递给不同实例的构造函数时,所有实例成员变量都会更新为映射的最新值[重复]

Posted

技术标签:

【中文标题】当映射变量传递给不同实例的构造函数时,所有实例成员变量都会更新为映射的最新值[重复]【英文标题】:When a map variable is passed to constructor of different instances, all instances member variables are updated to latest value of map [duplicate] 【发布时间】:2020-03-19 06:27:31 【问题描述】:

主类--

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());
    

Class 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

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

【问题讨论】:

输出与您的实际代码打印的不匹配(修复代码后 - 您有一个额外的大括号并且您缺少导入)。从根本上说,问题在于您的两个Class1 实例都使用对相同HashMap 的引用。如果你想让它们独立,它们应该有独立的地图对象。 【参考方案1】:

从您的代码中可以看出,您将相同的 HashMap 引用到 instacne1 和 instance2 对象,并且在 getClassDetails 方法中,将调用相同 hashmap 的 tostring 方法,因此输出相同,请使用此代码 sn-p:

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());
    

【讨论】:

可能没有真正的理由制作var1var2 静态字段。只能是 main 中的局部变量。 @Thilo:是的,没错,我只是编辑他的代码才能工作,我会编辑答案 现在超级混乱。为什么要重复使用相同的变量而不是 map1map2 @Thilo : 因为 map 的两个实例是多余的,所以似乎地图不是重点,如果他愿意,他可以通过它的引用检索地图。 实际上我使用的是同一个变量,因为我没有在其他任何地方引用这个变量,所以为什么要使用额外的空间,我可能是错的,但这就是我的想法。制作 var1 static 是否必须按照标准指南做一些事情,或者只是更好地使用?你能详细说明一下吗? @ShayanTabatabaee - 使用您的解决方案(var = new HashMap();),我的问题得到了解决。

以上是关于当映射变量传递给不同实例的构造函数时,所有实例成员变量都会更新为映射的最新值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java基础 -- 静态方法和实例方法有何不同无参构造函数有什么作用import java和javax有什么区别成员变量与局部变量的区别有哪些(成员变量有默认赋值)

是否可以在 JavaScript 构造函数中解构实例/成员变量?

原型模式

20165327 第三周学习总结

将创建的对象实例传递给映射器

实例构造函数与静态构造函数执行顺序