Додайте об’єкт до ArrayList і змінюйте його пізніше


80

Якщо у мене є ArrayList, і я додав до нього об’єкт, а пізніше я змінив цей об’єкт, чи відобразиться ця зміна в ArrayList? або коли я додаю об'єкт до ArrayList, Java створює копію та додає його до ArrayList?

Що робити, якщо я зміню посилання на цей об’єкт на нульове? Чи означає це, що об'єкт у ArrayList тепер теж нульовий?


1
Це питання (і відповідь) справді заслуговує на закладку!
Террі

Тільки всі питання, які я збирався поставити :)
navid

Відповіді:


84

чи відобразиться ця зміна в ArrayList?

Так, оскільки ви додали посилання на об’єкт у списку. Додане посилання все одно вказуватиме на той самий об’єкт (який ви змінили).


або коли я додаю об'єкт до ArrayList, Java створює копію та додає його до ArrayList?

Ні, об’єкт не буде скопійовано. (Він скопіює посилання на об’єкт.)


Що робити, якщо я зміню посилання на цей об’єкт на нульове? Чи означає це, що об'єкт у 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]

що з цим: Кнопка a = нова кнопка; Кнопка b = нова кнопка; Струм кнопки = a; List.add (поточний); струм = b; Якщо я надрукую вміст списку, це буде "a" або "b"?
Lorenzo Sciuto

1
@aioobe Ваша відповідь суперечить першому пункту у вашому дописі, де ви заявляєте, що посилання на об'єкт копіюється (в даному випадку - "поточний"), яке потім змінюється з a на b. Я б очікував, що він друкує b. Чи можете ви детальніше сказати?
Jan K.

2
Тільки майте на увазі, що Java завжди передається за значенням (зокрема посилання на об'єкти передаються за значенням), і все це повинно бути зрозумілим.
aioobe

здається, це не стосується додавання a, Stringа потім його зміни. тобтоString a = "first"; list.add(a); a = "second"; ...print(list.get(0)) // "first"
Дон Чідл

Я думаю, ви можете пояснити, що мається на увазі під цим, pass by valueоскільки це, мабуть, означає, що вас, що було надіслано, не можна змінити, оскільки було надіслано значення, а не посилання на щось
Дон Чідл

5

Будь-які зміни об’єкта будуть відображені у списку.

Однак, коли ви маєте справу з такими об'єктами, як рядки, які є незмінними, новий об'єкт буде створений на "операціях зміни". Чим насправді ваш старий об'єкт все ще є у списку, тоді як ви отримали новий в іншому.


це дуже важлива відмінність
Дон Чідл

1

Дякую всім хлопцям. Я ще раз зрозумів це, прочитавши ваші дописи. Це, мабуть, заплутане поняття, оскільки я його вже давно засвоїв, але нещодавно забув, як це працює знову. Тож я хочу поділитися ключем, який вирішує проблему для мене. (зауважте, що непримітивні об’єкти (примітиви - це int, логічні значення тощо) у java - це технічно вказівники). Коли у додати об'єкт про до списку, список і 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)

сподіваюся, це комусь допоможе


-1

Хотіли додати ще одну демонстрацію, де 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]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.