我想将用户定义的类型(如下所示)添加到ArrayList
。
import java.util.ArrayList;
class MyObj
{
int iX;
}
public class testForLoopjava
{
public static void main(String[] args)
{
MyObj ob1 = new MyObj();
ArrayList<MyObj> al = new ArrayList<MyObj>();
int a,b;
for(int i =0;i<5;i++)
{
ob1.iX = i + 5;
al.add(ob1);
}
for(int j=0;j<5;j++)
System.out.println("iX: "+al.get(j).iX);
}
}
当我尝试打印上述代码时,iX
始终会打印9
。即iX
由列表中的最后一个值更新。这是什么原因?我在做一些基本的错误。?
输出:
iX: 9
iX: 9
iX: 9
iX: 9
iX: 9
答案 0 :(得分:8)
您每次都会将相同的对象添加到列表中。您应该使用循环中创建的新实例。
e.g .-
ArrayList<MyObj> al = new ArrayList<MyObj>();
int a,b;
for(int i =0;i<5;i++)
{
MyObj ob1 = new MyObj();
ob1.iX = i + 5;
al.add(ob1);
}
否则,您的列表将包含对同一实例的引用列表,并修改一个实例会影响该列表中的每个条目。
这种问题是尽可能使用不可变对象的有力论据。如果可以,一个好方法是在构造函数中实例化iX
字段并使其final
因此不允许它更改实例化后(检查Java final
关键字)。
public class MyObj {
private final int iX;
public MyObj(int i) {
iX = i; // iX is initialised here but can't be changed again
}
}
这种方法可以产生更安全的解决方案(如上所述),但需要注意的是您的对象可以在实例化后更改。这听起来像是一种限制性做法,但你会惊讶地发现你的许多物品都能以这种方式实现。
答案 1 :(得分:2)
那是因为你总是在列表中放置相同的实例(同一个对象)。
尝试:
public static void main(String[] args)
{
ArrayList<MyObj> al = new ArrayList<MyObj>();
int a,b;
for(int i =0;i<5;i++)
{
MyObj ob1 = new MyObj();
ob1.iX = i + 5;
al.add(ob1);
}
for(int j=0;j<5;j++)
System.out.println("iX: "+al.get(j).iX);
}
答案 2 :(得分:0)
您将相同对象多次添加到列表中。您只创建了一个MyObj
,并且只更改了对象所持有的int值。
答案 3 :(得分:0)
那是因为你只保留一个对MyObj的引用,所有元素都引用它。尝试按如下方式修改代码:
for(int i =0;i<5;i++)
{
MyObj ob1 = new MyObj();
ob1.iX = i + 5;
al.add(ob1);
}
同样,删除循环外的ob1定义。
答案 4 :(得分:0)
您每次都在更改同一个对象,所以在循环中最后一次设置ob1.iX = 4 + 5(= 9)。 您应该每次都创建一个新实例,所以将它放在循环中:
for(int i =0;i<5;i++)
{
MyObj ob1 = new MyObj();
ob1.iX = i + 5;
al.add(ob1);
}
答案 5 :(得分:0)
使用Object数组的另一个版本:
package com.may.arrays;
import java.util.ArrayList;
public class AddObjectToArray {
public static void main(String args[]){
ArrayList<MyObject> l_list = new ArrayList<MyObject>();
MyObject l_myObj = new MyObject();
l_myObj.holder = new MyObject2[6];
for(int i=0;i<5;i++){
l_myObj.holder[i] = new MyObject2();
l_myObj.holder[i].value = i+5;
l_list.add(l_myObj);
}
for(int j=0;j<5;j++){
System.out.println("value is: "+l_list.get(j).holder[j].value);
}
}
}
class MyObject{
MyObject2[] holder;
}
class MyObject2{
int value;
}
答案 6 :(得分:0)
您要将相同的对象添加到列表中,因为这会给出相同的结果。 你必须每次都创建新的实例。 :)