Добавление пользовательских объектов в ArrayList в Java - PullRequest
3 голосов
/ 22 ноября 2011

Я хочу добавить определенный пользователем тип, как показано ниже, к 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 ]

8 голосов
/ 22 ноября 2011

Вы добавляете один и тот же объект в список каждый раз.Вы должны использовать свежий экземпляр, созданный в цикле.
eg-

    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
   }
}

Этот подход может дать более безопасное решение (по сравнению с вышеизложенным) с оговоркой о том, что ваши объекты могут быть изменены после создания экземпляра.Это звучит как ограничительная практика, но вы будете удивлены, обнаружив, что многие ваши объекты могут быть реализованы таким образом.

2 голосов
/ 22 ноября 2011

Это потому, что вы всегда помещаете в список один и тот же экземпляр (один и тот же объект).

try:

 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);
    }
0 голосов
/ 07 августа 2013

вы добавляете тот же объект в список, потому что это дает тот же результат.Вы должны создавать новый экземпляр каждый раз.:)

0 голосов
/ 28 июня 2013

Еще одна версия с использованием массива объектов:

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;
}
0 голосов
/ 22 ноября 2011

Вы каждый раз меняете один и тот же объект, поэтому в последний раз в вашем цикле он устанавливает ob1.iX = 4 + 5 (= 9). Вы должны каждый раз создавать новый экземпляр, поэтому поместите его в свой цикл:

for(int i =0;i<5;i++)
{
  MyObj ob1 = new MyObj();
  ob1.iX = i + 5;
  al.add(ob1);
}
0 голосов
/ 22 ноября 2011

это потому, что вы сохраняете только одну ссылку на MyObj и все элементы ссылаются на нее.попробуйте изменить код следующим образом:

for(int i =0;i<5;i++)
    {
        MyObj ob1 = new MyObj();
        ob1.iX = i + 5;
        al.add(ob1);
    }

также удалите определение ob1 вне цикла.

0 голосов
/ 22 ноября 2011

Вы добавляете один и тот же объект несколько раз в список. У вас есть только один MyObj созданный, и вы меняете только значение int, которое содержит объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...