gpt4 book ai didi

java - 调用List中对象的setter方法也会改变List中其他对象的属性。列表是HashMap中的值

转载 作者:行者123 更新时间:2023-12-01 07:37:08 26 4
gpt4 key购买 nike

我有一个包含键字符串和值列表的映射。将多个条目放入 Map 并随机扩展 Map 中的列表值后,出现以下问题:

    list3 = map.get("string1");
list3.get(0).setName("testobject");
for(TestObject to : list3){
System.out.println(to.getName());
}

不仅设置第一个测试对象名称为“testobject”,它还设置列表(list3)中的其他测试对象名称为“testobject”,即:

**Output**
testobject
nonameset
nonameset
nonameset
testobject
nonameset
nonameset
nonameset
testobject
nonameset

完整的代码写在下面。我想这个问题与随机扩展 map 中的列表值(randomlyExpand函数)和引用有关,但由于我的Java知识仍在开始发展,我并不真正理解发生了什么。这可能是一件非常愚蠢的事情。所以我的问题是:这是怎么回事?以及如何在保留相同功能的同时解决问题。

import java.util.*;
public class Test {
public static void main(String[] args) {
Map<String, List<TestObject>> map = new HashMap<String, List<TestObject>>();
List<TestObject> list1 = new ArrayList<TestObject>();
List<TestObject> list2 = new ArrayList<TestObject>();
List<TestObject> list3 = new ArrayList<TestObject>();

for(int i = 0; i < 5; i++){
list1.add(new TestObject());
}
for(int i = 0; i < 5; i++){
list2.add(new TestObject());
}
map.put("string1", list1);
map.put("string2", list2);

map = randomlyExpand(map);

list3 = map.get("string1");
list3.get(0).setName("testobject");
for(TestObject to : list3){
System.out.println(to.getName());
}
}

//Randomly expand list values in Map from size 5 to size 10
public static Map<String, List<TestObject>> randomlyExpand(Map<String, List<TestObject>> map){
Random ran = new Random();
for (String key : map.keySet()){
List<TestObject> tempList = new ArrayList<TestObject>();
List<TestObject> values = map.get(key);
for (int i = 0; i < 10; i++){
int randomInt = ran.nextInt(values.size());
tempList.add(values.get(randomInt));
}
map.put(key, tempList);
}
return map;
}
}

测试对象类:

public class TestObject {
private String name = "nonameset";

TestObject(){
}

public String getName(){
return this.name;
}

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

最佳答案

在 randomExpand 方法中,您将添加列表中已有的相同值。您将新条目添加到列表中,但对象完全相同。

当您将对象添加到列表时,您不会添加该对象的副本,而只是添加对该对象的引用。

这就是为什么当您更改其中一个条目中的属性时,它似乎会在其他对象中反射(reflect)此更改。实际上,发生这种情况是因为您将同一个对象多次添加到列表中。

关于java - 调用List中对象的setter方法也会改变List中其他对象的属性。列表是HashMap中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10399756/

26 4 0
文章推荐: Java:使用扫描仪读取 boolean 值失败。
文章推荐: python - 用于稀疏 Hermitian 矩阵的 Python LDLT 分解,有吗?
文章推荐: java - 如何在 JSP 上将 Map 的键放入