引用Last Object Java的列表

时间:2015-05-05 05:02:40

标签: java

在将对象添加到列表时,它仅引用最后一个对象。

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是否能够获取所有对象?

3 个答案:

答案 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]