列表引用最后一个Java对象

列表引用最后一个Java对象,java,Java,将对象添加到列表时,它仅引用最后一个对象 MyClass obj = new MyClass(); List<MyClass> myList = new ArrayList<>(); for(i=0;i<3;i++){ obj.setNumber(i+1); myList.add(obj); } MyClass obj=newmyclass(); List myList=new ArrayList(); 对于(i=0;i在第一个代码段中,您正在添加对M

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

MyClass obj = new MyClass();
List<MyClass> myList = new ArrayList<>();
for(i=0;i<3;i++){
   obj.setNumber(i+1);
   myList.add(obj);
}
MyClass obj=newmyclass();
List myList=new ArrayList();

对于(i=0;i在第一个代码段中,您正在添加对
Myclass
'obj'的引用,并通过调用
setNumber(i)
更新编号,它将首先在同一引用上添加1,然后添加2和3


在第二个代码片段中,您正在添加新类,然后在第一个示例中,您有一个苹果,您将它放在包中三次(每次放进去都咬一口)。最后,该苹果将被咬三次,每次咬一口都会覆盖上一个。 你的包里似乎有三个苹果,但如果你试图取出苹果1、苹果2或苹果3,你实际上会得到同一个苹果

在第二个例子中,你有三个苹果。你把每个苹果咬(越来越大)一口,然后把它放进包里,最后得到三个不同的苹果

在上一个代码段中,结果取决于列表中的内容。由于映射中不能有重复的键,因此,如果列表中的对象具有相同的
编号
值(无论是否为相同的实例),则其中只有一个(列表中的最后一个)将在映射中结束

对于使用第一个代码段构建的列表,映射将是
3->obj1
,对于使用第二个代码段构建的列表,映射将是
1->obj1,2->obj2,3->obj3
,从而包含列表中的所有元素


如果列表包含两个数值为
2
的实例,则只有最后一个实例会映射到该键。

实际上,列表是一个集合,其中包含对象而非对象的引用。引用是指向C中某些现存的指针。 您也可以访问此页面

在第一段代码中,您创建了MyClass的一个且仅一个实例,然后将其引用添加到列表中三次。 因此,列表中的所有元素都是一个实例的引用, 通过为列表中的每个元素设置一个值,实际上可以更改该对象的状态。 像这样的 myList(0)->obj myList(1)->obj myList(2)->obj

如果你把地图填上,就会是这样 myMap[3,obj] 因为贴图不能包含重复的键

但在第二个示例中,您创建了MyClass的三个实例,并将它们全部添加到列表中。 每个实例都有自己的状态(本例中为数字)。因此,通过为实例设置一个新的数字,您不会更改其他实例的状态。 像这样的 myList(0)->obj1 myList(1)->obj2 myList(2)->obj3

如果你把地图填上,就会是这样 myMap[1,obj1] myMap[2,obj2]
myMap[3,obj3]

在第一个示例中,您只创建了
MyClass
obj
)的一个实例在第一个示例中,所有列表索引引用都指向同一个对象,因此无论调用哪个索引,都将得到同一个对象。在第二个示例中,每个列表索引都指向具有不同状态(即数字)的不同对象明白了。还有一个类似的疑问。我会更新这个问题。@MadProgrammer你能不能帮我理解地图编辑后的代码片段。我们能用这种方式将myList的所有对象添加到myMap中?
 MyClass obj;
 List<MyClass> myList = new ArrayList<>();
 for(i=0;i<3;i++){
   obj = new MyClass();
   obj.setNumber(i+1);
   myList.add(obj);
 }
 Map<int,MyClass> myMap = new HashMap<>();
 for(MyClass obj : myList){
     myMap.put(obj.getNumber(),obj);
 }