Добавьте объект в ArrayList и измените его позже.
Если у меня есть ArrayList, и я добавил к нему объект, а позже я изменил этот объект, будет ли это изменение отражать в ArrayList? или когда я добавляю объект в ArrayList, Java создает копию и добавляет ее в ArrayList?
Что делать, если я изменяю ссылку на этот объект на null? Означает ли это, что объект в массиве ArrayList тоже имеет значение null?
Ответы
Ответ 1
будет ли это изменение отражать в ArrayList?
Да, поскольку вы добавили ссылку на объект в списке. Добавленная ссылка будет по-прежнему указывать на один и тот же объект (который вы изменили).
или когда я добавляю объект в ArrayList, Java создает копию и добавляет ее в ArrayList?
Нет, он не будет копировать объект. (Он скопирует ссылку на объект.)
Что делать, если я изменяю ссылку на этот объект на null? Означает ли это, что объект в 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]
Ответ 2
Любое изменение объекта будет отражено в списке.
Однако, когда вы имеете дело с объектами, которые являются неизменяемыми, новый объект будет создан в "операциях изменения". Чем на самом деле ваш старый объект все еще находится в списке, а у вас есть новый в другом месте.
Ответ 3
Спасибо всем, ребята. Я понял это снова, прочитав ваши посты. Вероятно, это сбивает с толку понятие, так как у меня это переварилось давно, но недавно я забыл, как это работает снова. Поэтому я хочу поделиться ключом, который решает проблему для меня. (обратите внимание, что не примитивные Объекты (примитивы int, логические и т.д.) в Java являются технически указателями). Когда вы добавляете объект o в список, список и o указывают на одно и то же, поэтому при изменении o элемент списка изменяется. Это до тех пор, пока они указывают на одно и то же и ломаются, когда o указывает на что-то еще с помощью =.
o = null; //o points to nothing and changes in o from now on doesn't effect the list item
или же
Object a = new Object();
o = a; //o and the list item don't point to same thing so changes in o doesn't effect the list item (but it effects a)
надеюсь, это поможет кому-то
Ответ 4
Требуется добавить еще одну демонстрацию, где ArrayList находится внутри Карты в качестве значения. ArrayList изменяется после добавления в Map и Map отражает изменения.
В карте есть один элемент с именем матери в качестве ключа, а дети - значением.
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]