gpt4 book ai didi

java - 循环中 java.util.Map.putAll(Map<>) 和 java.util.Map.put(Integer, Object) 有什么区别

转载 作者:行者123 更新时间:2023-12-01 06:42:16 25 4
gpt4 key购买 nike

在下面的代码中,我发现如果我们在参数中传递 map ,使用 putAll 方法可能会出现问题

public class Main {

public static void main(String...strings ) {
Etudiant e1=new Etudiant(5, "A");
Etudiant e2=new Etudiant(6, "B");

Map<Integer, Etudiant> map= new HashMap<>();
map.put(1, e1);
map.put(2, e2);

Map<Integer, Etudiant> map2= new HashMap<>();
map2.put(1,map.get(1));
map2.put(1,map.get(2));

changeMe(map2);
System.out.println(map.get(1));

Map<Integer, Etudiant> map3= new HashMap<>();
map3.putAll(map);
changeMe(map3);
System.out.println(map.get(1));
}

private static void changeMe(Map<Integer, Etudiant> etudiants) {
etudiants.get(1).name="K";
}
}
}

这是输出结果:

Etudiant [age=5, name=A]
Etudiant [age=5, name=K]

你能解释一下其中的区别吗?

为什么使用putAll后对象发生变化?

最佳答案

您的代码详细解释

Etudiant e1=new  Etudiant(5, "A");
Etudiant e2=new Etudiant(6, "B");

Map<Integer, Etudiant> map= new HashMap<>();
map.put(1, e1);
map.put(2, e2);

map 现在包含 {1=Etudiant(5, "A"), 2=Etudiant(6, "B")}

Map<Integer, Etudiant> map2= new HashMap<>();
map2.put(1,map.get(1));
map2.put(1,map.get(2));

map2 现在包含 {1=Etudiant(6, "B")}

changeMe(map2);
System.out.println(map.get(1));

Etudiant(6, "B")重命名 Etudiant(6, "K"),因此:
map 现在包含 {1=Etudiant(5, "A"), 2=Etudiant(6, "K")}
map2 现在包含 {1=Etudiant(6, "K")}
它打印了:

Etudiant(5, "A")

Map<Integer, Etudiant> map3= new HashMap<>();
map3.putAll(map);

map3 内容是 map 内容的副本,因此:
map3 现在包含 {1=Etudiant(5, "A"), 2=Etudiant(6, "K")}

changeMe(map3);
System.out.println(map.get(1));

Etudiant(5, "A")重命名 Etudiant(5, "K"),因此:
map 现在包含 {1=Etudiant(5, "K"), 2=Etudiant(6, "K")}
map2 现在包含 {1=Etudiant(6, "K")}
map3 现在包含 {1=Etudiant(5, "K"), 2=Etudiant(6, "K")}
它打印了:

Etudiant(5, "K")

该代码的工作方式与您编码的方式完全相同。

<小时/>

通过添加一堆打印语句可以轻松查看以上所有内容,这是调试代码的一种方法。

public class Test {
public static void main(String[] args) {
Etudiant e1=new Etudiant(5, "A");
Etudiant e2=new Etudiant(6, "B");

Map<Integer, Etudiant> map= new HashMap<>();
map.put(1, e1);
map.put(2, e2);
System.out.println("map: " + map);

Map<Integer, Etudiant> map2= new HashMap<>();
map2.put(1,map.get(1));
map2.put(1,map.get(2));
System.out.println("map2: " + map2);

changeMe(map2);
System.out.println("map: " + map);
System.out.println("map2: " + map2);
System.out.println(map.get(1));

Map<Integer, Etudiant> map3= new HashMap<>();
map3.putAll(map);
System.out.println("map3: " + map3);

changeMe(map3);
System.out.println("map: " + map);
System.out.println("map2: " + map2);
System.out.println("map3: " + map3);
System.out.println(map.get(1));
}
private static void changeMe(Map<Integer, Etudiant> etudiants) {
System.out.print("Renamed " + etudiants.get(1));
etudiants.get(1).name="K";
System.out.println(" to " + etudiants.get(1));
}
}
class Etudiant {
int id;
String name;
Etudiant(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Etudiant(" + this.id + ", \"" + this.name + "\")";
}
}

输出

map:  {1=Etudiant(5, "A"), 2=Etudiant(6, "B")}
map2: {1=Etudiant(6, "B")}
Renamed Etudiant(6, "B") to Etudiant(6, "K")
map: {1=Etudiant(5, "A"), 2=Etudiant(6, "K")}
map2: {1=Etudiant(6, "K")}
Etudiant(5, "A")
map3: {1=Etudiant(5, "A"), 2=Etudiant(6, "K")}
Renamed Etudiant(5, "A") to Etudiant(5, "K")
map: {1=Etudiant(5, "K"), 2=Etudiant(6, "K")}
map2: {1=Etudiant(6, "K")}
map3: {1=Etudiant(5, "K"), 2=Etudiant(6, "K")}
Etudiant(5, "K")

关于java - 循环中 java.util.Map.putAll(Map<>) 和 java.util.Map.put(Integer, Object) 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53289969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com