我有一个包含键的字符串和作为值的列表的 Map。在将几个条目放入 Map 并随机扩展 Map 中的 List 值后,我遇到以下问题:
list3 = map.get("string1");
list3.get(0).setName("testobject");
for(TestObject to : list3){
System.out.println(to.getName());
}
它不仅设置名称为“testobject”的第一个TestObject,还设置列表(list3)中名称为“testobject”的其他TestObject,即:
**Output**
testobject
nonameset
nonameset
nonameset
testobject
nonameset
nonameset
nonameset
testobject
nonameset
完整的代码写在下面。我猜这个问题与随机扩展地图中的 List 值(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;
}
}