ArrayList и модифицирующие объекты, включенные в него - PullRequest
23 голосов
/ 19 марта 2012

Скажем, у нас есть ArrayList myArray. Я хочу изменить объект, вызвав его функцию. Если я сделаю это таким образом, будет ли изменен исходный объект или нет?

myArray.get(0).myModyfyingFunction();

Для уточнения - меня беспокоит, возвращает ли get () ссылку на мой исходный объект или она возвращает только копию моего исходного объекта.

Ответы [ 7 ]

61 голосов
/ 19 марта 2012

get() вернет ссылку на объект, а не копию.Любое изменение, которое вы сделаете для возвращенной ссылки, будет выполнено для самого объекта

7 голосов
/ 19 марта 2012

Если вы храните какой-либо объект в ArrayList, объект не реплицируется, и любое изменение в объекте должно отражаться в самом объекте.

например, у нас есть класс NewClass

  public class NewClass {

private String mystring="";

/**
 * @return the mystring
 */
public String getMystring() {
    return mystring;
}

/**
 * @param mystring the mystring to set
 */
public void setMystring(String mystring) {
    this.mystring = mystring;
}

}

вот код в методе main любого другого класса

   List<NewClass> newclasses = new ArrayList<NewClass>();
    NewClass class1 = new NewClass();
    class1.setMystring("before1");
    NewClass class2 = new NewClass();
    class2.setMystring("before2");
    newclasses.add(class1);
newclasses.add(class2);
newclasses.get(0).setMystring("after1");
System.out.println(class1.getMystring());

Это будет выводить после 1.

2 голосов
/ 19 марта 2012

Это зависит от того, какой объект вы сохранили в вашем ArrayList.Например, если они java.lang.String s, вызовы ничего не изменят.Иначе, да, это изменит ваш объект, хранящийся с индексом 0.

1 голос
/ 19 марта 2012

Он дает вам ссылку на объект, поэтому, если ваша функция выполняет какие-либо изменения в своем состоянии, ваш объект будет изменен.

То же самое происходит, когда вы делаете это:

ArrayList myArray = new ArrayList();
MyObject obj = new MyObject();
myArray.add(obj);
obj.myModifyingFunction();
myArray.get(0).equals(obj); // returns true
myArray.get(0) == obj; // returns true as well
1 голос
/ 19 марта 2012

Java никогда не возвращает копии объектов, только копии ссылок на объекты.Таким образом, метод определенно изменит объект с индексом 0.

Вы можете получить «копию» объекта, если метод создаст его, например, с помощью return object.clone();, если это возможно, но что такое фактически возвращает ссылку на копию, которая все еще была создана в методе.Таким образом, вы можете получить «копию» объекта в более широком смысле, но ArrayList#get(...) этого не сделает - и по соглашению ни один из получателей не должен этого делать, если явно не указано.

0 голосов
/ 10 сентября 2013

Обновление объектов в списке:

for (User user: Users) {
    user.setName( user.getName() + " New Name");
}

Показать обновленные объекты

for (User user: Users) {    
    System.out.println( user.getName());
}
0 голосов
/ 14 марта 2013

Вот пример.Измените объект класса Test в списке.

public class ModifyArrayList {

    public static void main (String [] args) {

        List<Test> tests = new ArrayList<Test>();

        Test firstTest = new Test();
        firstTest.setId(100);
        firstTest.setName("John");
        tests.add(firstTest);

        Test secondTest = new Test();
        secondTest.setId(101);
        secondTest.setName("Tracy");
        tests.add(secondTest);

        Test thirdTest = new Test();
        thirdTest.setId(102);
        thirdTest.setName("Ryan");
        tests.add(thirdTest);

        ListIterator<Test> testIterator = tests.listIterator();
        while(testIterator.hasNext()) {

            Test test = testIterator.next();
            if (test.getName().equals("Ryan")) {
                test.setId(300);
            }

            testIterator.remove();
            testIterator.add(test);
        }

        for (Test test : tests) {
            System.out.println("Test #" + test.getId() + " name=" + test.getName());
        }

    }
}

Test.java

class Test {

    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
...