当映射变量传递给不同实例的构造函数时,所有实例成员变量都会更新为映射的最新值[重复]
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());
【讨论】:
可能没有真正的理由制作var1
和var2
静态字段。只能是 main
中的局部变量。
@Thilo:是的,没错,我只是编辑他的代码才能工作,我会编辑答案
现在超级混乱。为什么要重复使用相同的变量而不是 map1
和 map2
?
@Thilo : 因为 map 的两个实例是多余的,所以似乎地图不是重点,如果他愿意,他可以通过它的引用检索地图。
实际上我使用的是同一个变量,因为我没有在其他任何地方引用这个变量,所以为什么要使用额外的空间,我可能是错的,但这就是我的想法。制作 var1 static 是否必须按照标准指南做一些事情,或者只是更好地使用?你能详细说明一下吗? @ShayanTabatabaee - 使用您的解决方案(var = new HashMap以上是关于当映射变量传递给不同实例的构造函数时,所有实例成员变量都会更新为映射的最新值[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Java基础 -- 静态方法和实例方法有何不同无参构造函数有什么作用import java和javax有什么区别成员变量与局部变量的区别有哪些(成员变量有默认赋值)