在Java中将用户定义的对象添加到ArrayList

时间:2011-11-22 10:56:06

标签: java arraylist

我想将用户定义的类型(如下所示)添加到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

7 个答案:

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

您要将相同的对象添加到列表中,因为这会给出相同的结果。 你必须每次都创建新的实例。 :)