Почему один arraylist изменяется, когда его копия модифицируется
810 просмотра
6 ответа
Это, вероятно, очень простой, но все еще смущает меня!
import java.util.ArrayList;
public class Sample {
ArrayList<Integer> i = new ArrayList<>();
ArrayList<Integer> j = new ArrayList<>();
/**
* @param args
*/
public static void main(String[] args) {
new Sample().go();
}
private void go() {
i.add(1);
i.add(2);
i.add(3);
j=i;
i.remove(0);
System.out.println(i + "asd" + j);
}
}
Я попытался напечатать это:
[2, 3]asd[2, 3]
Почему j меняется, когда я меняюсь? Хотя не бывает с примитивами!
Автор: Mercenary Источник Размещён: 13.11.2019 11:37Ответы (6)
8 плюса
Оператор j=i;
назначает ссылку j
такой же, как и i
. Теперь оба i
и j
ссылаются на один и тот же ArrayList
объект. Удаление 0-го индекса просто видно по обеим ссылкам.
Если вы хотите, чтобы удаление элемента i
не влияло на список j
, создайте копию списка вместо назначения ссылок:
j = new ArrayList<Integer>(i);
(Это мелкая копия, поэтому списки по-прежнему ссылаются на одни и те же элементы.)
Автор: rgettman Размещён: 24.10.2013 05:491 плюс
использование
j = new ArrayList<>(i);
или же
Collections.copy(j, i);
создать копию.
С j = i
вами только сделать j
точку i
(это называется ссылка). Это относится ко всем назначениям, которые включают объекты (не примитивные типы, такие как int
или float
)
1 плюс
Объект не клонирован, просто добавлена дополнительная ссылка на объект. Поскольку ArrayList не является неизменным, любое изменение объекта отражается в обеих ссылках объекта.
Автор: A myth Размещён: 24.10.2013 05:520 плюса
Объекты и примитивы работают несколько иначе. Думайте об объекте как i
о названии этого объекта. Когда вы говорите j=i
, что говорите JVM: «забудьте о том, что другой ArrayList
, кого я сказал, был вызван j
; отныне, когда я имею в j
виду, я имею в виду этот, ArrayList
который также может быть вызван i
. И действительно, это именно то, что произошло: после этой строки оба переменные ссылаются на один и тот же объект.
Примитивы работают, как вы говорите. Если вы говорите i=5; j=i; i=6
, то j
все равно будет установлен на 5.
0 плюса
Вы создали стадию памяти для j с; j = новый ArrayList <> ();
но потом вы сказали, что пусть j относится к стадии памяти i. Так что после j = i; любые изменения в i или j будут влиять на них обоих. Потому что они ссылаются на одни и те же объекты.
0 плюса
Позвольте мне сделать это следующим образом для вас:
ArrayList<Integer> i = new ArrayList<>();
ArrayList<Integer> j = new ArrayList<>();
// checking hash code before j = i;
System.out.println(System.identityHashCode(i));
System.out.println(System.identityHashCode(j));
j = i;
// checking hash code after j = i;
System.out.println(System.identityHashCode(i));
System.out.println(System.identityHashCode(j));
сравнить оба значения, если они одинаковы, что означает, что после j=i;
ArrayList j
теперь указывает наArrayList i
В моей машине о / п было:
30269696 //hashCode of i
24052850 //hashCode of j before j = i;
30269696 //hashCode of i and j are same after j = i that means they are pointing to same reference and hence change in one reflects on the other.
30269696
Автор: Vishrant
Размещён: 24.10.2013 06:03
Вопросы из категории :
- java В чем разница между int и Integer в Java и C #?
- java Как я могу определить IP моего маршрутизатора / шлюза в Java?
- java Каков наилучший способ проверки XML-файла по сравнению с XSD-файлом?
- java Как округлить результат целочисленного деления?
- java Преобразование списка <Integer> в список <String>
- java Почему я не могу объявить статические методы в интерфейсе?
- java Библиотека Java SWIFT
- java Выключение компьютера
- java Как я могу воспроизвести звук на Java?
- java Когда выбирать отмеченные и непроверенные исключения
- java Какие проблемы следует учитывать при переопределении equals и hashCode в Java?
- java Java Swing: отображение изображений внутри Jar
- java Java: программный способ определения текущего пользователя Windows
- java Как настроить cookie HttpOnly в tomcat / java webapps?
- java Почему я получаю NoClassDefFoundError в Java?
- java Как исправить ошибку NoSuchMethodError?
- java Каковы различия между «универсальными» типами в C ++ и Java?
- java Как бороться с ошибкой «java.lang.OutOfMemoryError: Java heap space»?
- java Что такое рефлексия и почему она полезна?
- java Различия между HashMap и Hashtable?