在将对象添加到列表时,它仅引用最后一个对象。
MyClass obj = new MyClass();
List<MyClass> myList = new ArrayList<>();
for(i=0;i<3;i++){
obj.setNumber(i+1);
myList.add(obj);
}
当我尝试打印myList内容时,打印对象的getNumber返回3,即最后一个对象已添加到列表中。
但是当我尝试时:
MyClass obj;
List<MyClass> myList = new ArrayList<>();
for(i=0;i<3;i++){
obj = new MyClass();
obj.setNumber(i+1);
myList.add(obj);
}
它工作正常。我无法清楚地理解差异,因为在形成一个对象后我将它添加到List中,如果我要更新Object,为什么List的内容会改变?
编辑: 我理解上面代码片段的不同之处。但我还有一个疑问:
Map<int,MyClass> myMap = new HashMap<>();
for(MyClass obj : myList){
myMap.put(obj.getNumber(),obj);
}
在这种情况下,myMap是否能够获取所有对象?
答案 0 :(得分:1)
在你的第一个例子中,你有一个苹果放入你的包里三次(每次放入它时咬一口)。最后,那个苹果会被咬三次 - 每一口都会被上一个咬掉。 你的包将出现,里面有三个苹果,但如果你试图取出apple1,apple2或apple3,你实际上会得到同一个苹果。
在第二个例子中,你有三个苹果。你拿一个(越来越大)咬一口,把它放在你的包里,最后是三个不同的苹果。
在上一个代码段中,结果取决于列表中的内容。由于地图中不能有重复的键,如果列表中的对象具有相同的number
值(无论是否为相同的实例),则只有其中一个(列表中的最后一个)结束在地图上。
对于使用第一个代码段构建的列表,您的地图将为3 -> obj1
,对于使用第二个代码段构建的地图,它将为1 -> obj1, 2 -> obj2, 3 -> obj3
,因此包含列表中的所有元素。
如果您的列表包含两个数值为2
的实例,则只会为该键映射最后一个实例。
答案 1 :(得分:0)
在第一个代码段中,您要添加Myclass
&#39; obj&#39;并通过调用setNumber(i)
来更新号码,首先它会在同一参考上添加1然后2和3。
在第二个片段中,您要添加新课程,然后添加setNumber
答案 2 :(得分:0)
实际上,List是一个包含对象引用而不是对象的集合。参考文献是一些现存的像C中的指针。 您也可以访问此页面 Java - Are objects in a list held by value or reference?
在第一个代码中,您创建了一个且只有一个MyClass实例,然后将其引用添加到列表中三次。 因此,列表中的所有元素都是一个实例的引用, 通过为列表中的每个元素设置一个值,实际上您可以更改该对象的状态。 像这样的东西 myList(0) - &gt; OBJ myList(1) - &gt; OBJ myList(2) - &gt; OBJ
如果您填写地图,就会是这样的 myMap [3,obj] 因为地图不能包含重复的键。
但是在第二个示例中,您创建了三个MyClass实例,并将所有这些实例添加到列表中。 每个实例都有自己的状态(在这种情况下为数字)。因此,通过为实例设置新数字,您不会更改其他实例状态。 像这样的东西 myList(0) - &gt; OBJ1 myList(1) - &gt; OBJ2 myList(2) - &gt; OBJ3
如果您填写地图,就会是这样的 myMap [1,obj1] myMap [2,obj2] myMap [3,obj3]