列表引用最后一个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);
}