Добавить объект в ArrayList и изменить его позже - PullRequest
62 голосов
/ 16 августа 2011

Если у меня есть ArrayList, и я добавил к нему объект, а позже я изменил этот объект, отразится ли это изменение в ArrayList? или когда я добавляю объект в ArrayList, Java создает копию и добавляет ее в ArrayList?

Что если я поменяю ссылку на этот объект на ноль? Значит ли это, что объект в ArrayList теперь тоже нулевой?

Ответы [ 4 ]

71 голосов
/ 16 августа 2011

отразится ли это изменение в ArrayList?

Да, поскольку вы добавили ссылку к объекту в списке. Ссылка, которую вы добавили, будет по-прежнему указывать на тот же объект (который вы изменили).


или когда я добавляю объект в ArrayList, Java создает копию и добавляет ее в ArrayList?

Нет, объект не будет скопирован. (Будет скопирована ссылка на объект.)

1025 *
*

Что если я поменяю ссылку на этот объект на ноль? Значит ли это, что объект в ArrayList теперь тоже нулевой?

Нет, поскольку содержание исходной ссылки было скопировано при добавлении в список. (Имейте в виду, что копируется ссылка , а не объект.)

Демонстрация:

StringBuffer sb = new StringBuffer("foo");

List<StringBuffer> list = new ArrayList<StringBuffer>();
list.add(sb);

System.out.println(list);   // prints [foo]
sb.append("bar");

System.out.println(list);   // prints [foobar]

sb = null;

System.out.println(list);   // still prints [foobar]
4 голосов
/ 16 августа 2011

Любое изменение объекта будет отражено в списке.

Однако, когда вы имеете дело с такими объектами, как Strings, которые являются неизменяемыми, новый объект будет создан при «операциях изменения».Чем на самом деле ваш старый объект все еще находится в списке, а вы получили новый в другом месте.

0 голосов
/ 14 декабря 2018

Спасибо всем, ребята. Я понял это снова, прочитав ваши посты. Вероятно, это сбивает с толку понятие, так как у меня это переварилось давно, но недавно я забыл, как это работает снова. Поэтому я хочу поделиться ключом, который решает проблему для меня. (обратите внимание, что не примитивные объекты (примитивы int, boolean и т. д.) в Java являются технически указателями). Когда вы добавляете объект o в список, список и o указывают на одно и то же, поэтому при изменении o элемент списка изменяется. Это до тех пор, пока они указывают на одно и то же и ломаются, когда o указывает на что-то еще на = .

o = null;   //o points to nothing and changes in o from now on doesn't effect the list's item

или

Object a = new Object();
o = a;    //o and the list's item don't point to same thing so changes in o doesn't effect the list's item (but it effects a)

надеюсь, это кому-нибудь поможет

0 голосов
/ 15 января 2015

Хотел добавить еще одну демонстрацию, где ArrayList находится внутри карты в качестве значения. ArrayList изменяется после добавления на карту, и карта отражает изменения.

Карта содержит один элемент с именем матери в качестве ключа и дочерними в качестве значения.

    String key = "adeleMom";
    Map<String, ArrayList<String>> myMap = new HashMap<String, ArrayList<String>>();
    ArrayList<String> firstList = new ArrayList<String>();
    firstList.add("adele");
    myMap.put(key, firstList);
    firstList = null;
    ArrayList secondList = myMap.get(key);
    System.out.println(secondList); // prints [adele]
    secondList.add("bonnie");
    System.out.println("Added bonnie");
    ArrayList thirdList = myMap.get(key);
    System.out.println(thirdList); // prints [adele, bonnie]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...