Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 调用列表中对象的setter方法也会更改列表中其他对象的属性。列表是HashMap中的值_Java_Reference_Arraylist_Hashmap - Fatal编程技术网

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);
}