Java 调用列表中对象的setter方法也会更改列表中其他对象的属性。列表是HashMap中的值
我有一个包含键字符串和值列表的映射。在将多个条目放入映射并随机扩展映射中的列表值后,我遇到以下问题:Java 调用列表中对象的setter方法也会更改列表中其他对象的属性。列表是HashMap中的值,java,reference,arraylist,hashmap,Java,Reference,Arraylist,Hashmap,我有一个包含键字符串和值列表的映射。在将多个条目放入映射并随机扩展映射中的列表值后,我遇到以下问题: list3 = map.get("string1"); list3.get(0).setName("testobject"); for(TestObject to : list3){ System.out.println(to.getName()); } 它不仅使用名称TestObject设置第一个TestObject,还使用名称TestObje
list3 = map.get("string1");
list3.get(0).setName("testobject");
for(TestObject to : list3){
System.out.println(to.getName());
}
它不仅使用名称TestObject设置第一个TestObject,还使用名称TestObject设置列表3中的其他TestObject,即:
**Output**
testobject
nonameset
nonameset
nonameset
testobject
nonameset
nonameset
nonameset
testobject
nonameset
完整的代码写在下面。我猜这个问题与随机扩展map randomlyExpand函数中的列表值和引用有关,但是由于我的Java知识仍在发展,我并不真正理解发生了什么。这可能真的很愚蠢。所以我的问题是:这里发生了什么?如何在保留相同功能的同时解决问题
导入java.util.*;
公开课考试{
公共静态无效字符串[]args{
Map Map=新的HashMap;
列表列表1=新的ArrayList;
List list2=新的ArrayList;
List list3=新的ArrayList;
forint i=0;i<5;i++{
list1.addnewtestobject;
}
forint i=0;i<5;i++{
list2.addnewtestobject;
}
map.putstring1,列表1;
map.putstring2,列表2;
map=随机展开map;
list3=map.getstring1;
list3.get0.setNametestobject;
FORTEST对象:列表3{
System.out.printlnto.getName;
}
}
//随机将地图中的列表值从大小5扩展到大小10
公共静态地图随机展开地图地图{
随机ran=新随机;
对于字符串键:map.keySet{
列表模板列表=新的ArrayList;
列表值=map.getkey;
对于int i=0;i<10;i++{
int randomInt=ran.nextingvalues.size;
templast.addvalues.getrandomInt;
}
map.putkey,圣堂武士;
}
返回图;
}
}
TestObject类:
公共类测试对象{
私有字符串名称=nonameset;
测试对象{
}
公共字符串getName{
返回此.name;
}
public void setNameString s{
this.name=s;
}
}
在randomlyExpand方法中,添加的值与列表中已有的值相同。您可以向列表中添加新条目,但对象完全相同 将对象添加到列表中时,不会添加该对象的副本,而只是添加对该对象的引用 这就是为什么当您更改其中一个条目中的特性时,它似乎会在其他对象中反映此更改。实际上,发生这种情况是因为同一对象被多次添加到列表中。问题在于randomlyExpand函数。您正在迭代之前使用以下方法创建的5个可分辨对象的列表:
for(int i = 0; i < 5; i++){
list2.add(new TestObject());
}
您将获得一个此可分辨对象,并将其再次添加到另一个索引中。现在,这个对象在列表中出现两次甚至更多次。因此,同一对象在列表中多次出现。这就是你多次看到或看到物体的方式
解决方案很简单:在循环中创建新对象
for (int i = 0; i < 10; i++){
int randomInt = ran.nextInt(values.size());
TestObject obj = new TestObject();
obj.setName(values.get(randomInt).getName());
tempList.add(obj);
}
很好的解释和简洁的回答,谢谢!不过他接受了另一个答案,因为他还发布了一个不错的代码示例。
for (int i = 0; i < 10; i++){
int randomInt = ran.nextInt(values.size());
TestObject obj = new TestObject();
obj.setName(values.get(randomInt).getName());
tempList.add(obj);
}