Java:将对象添加到对象列表中

时间:2012-01-25 11:41:10

标签: java struts2

它非常简单,但不知何故不起作用(奇怪!!)。

我有一个类类型的列表。我在for循环中将对象添加到列表中。直到添加对象一切正常,但是一旦我尝试访问列表,只显示最后一个对象的值(参考我在下面显示的输出)。这里还有代码:

    List<myClass> myClassList = new ArrayList<myClass>();
    myClass myClassObj = new myClass();

    for(int i=0;i<someArray.length;i++){
        myClassObj.setProperty1("value1");
        myClassObj.setProperty2("value2");
        myClassObj.setProperty3("value3");
        ...
        ...Others
        ...
        System.out.println(myClassList.add(myClassObj));////////////////////////
    }

    System.out.println(myClassList.size());/////////////////////////////////////

    for(int i=0;i<myClassList.size();i++){
        System.out.println(myClassList.get(i).getProperty1());/////////////////
        .....
        .....Others
        .....
    }
    Iterator<myClass> mcItr = myClassList.iterator();
    while(mcItr.hasNext()){
        myClass obj = mcItr.next();
        System.out.println(obj.getProperty1());
        .....
        .....Others
        .....
    }

此计划的输出(如果someArray的尺寸为 5 ):

    //'true' --> 5 times. Printed by the 'add' statement as it returns 'true' when everything is OK

    //5  --> Size of 'myClassList' this is also OK

    //Here the values corresponding to the fifth and the last object are printed and repeated 5 times. Instead of printing each objects value once. (whichever way of printing to console I may use, the result is same).

在这里,我无法弄清楚我是以错误的方式创建列表还是以错误的方式访问它。

请建议。

谢谢!

2 个答案:

答案 0 :(得分:5)

填充列表时,您反复将引用添加到同一对象。要修复,请将myClassObj初始化移动到循环中:

for(int i=0;i<someArray.length;i++){
    myClass myClassObj = new myClass(); // <---- moved this into the loop
    myClassObj.setProperty1("value1");

这将为列表的每个元素创建一个单独的对象。

答案 1 :(得分:2)

每次都需要创建一个新的myClassObj,您的代码使用相同的对象引用。

List<myClass> myClassList = new ArrayList<myClass>();

    for(int i=0;i<someArray.length;i++){
        myClass myClassObj = new myClass(); // HERE
        myClassObj.setProperty1("value1");       
        ...
        System.out.println(myClassList.add(myClassObj));////////////////////////
    }