Как скопировать ArrayList, на который не могут повлиять исходные изменения ArrayList?
1235 просмотра
3 ответа
Я использовал ArrayLists в моем проекте, и мне нужно создать ArrayList по умолчанию, чтобы я мог сбросить исходный, когда захочу. Итак, я копирую оригинальный ArrayList, чтобы создать файл по умолчанию. Однако всякий раз, когда я изменяю что-то в оригинале, он также меняет одно по умолчанию. Как я могу сделать копию "статичной" и неизменяемой?
Вот мой код: (это на португальском языке)
private ArrayList<Compartimento> listaCompartimentos;
private ArrayList<Compartimento> listaCompartimentosDEFAULT;
public Simulador() {
this.listaCompartimentos = new ArrayList<>();
this.listaCompartimentosDEFAULT=new ArrayList<>();
}
//Copy of the array
public void gravarListaDefault(){
this.listaCompartimentosDEFAULT=(ArrayList<Compartimento>)listaCompartimentos.clone();
}
Примечание: я не знаю, может ли это быть причиной этого, но ArrayList listaCompartimentos имеет listaEquipamentos. Для каждого "Compartimento" есть ArrayList "listaEquipamentos".
Автор: Carlito Источник Размещён: 12.11.2019 09:22Ответы (3)
5 плюса
Клонирование означает, что у вас есть 2 разных списка, но их содержимое одинаково. Если вы измените состояние объекта в первом списке, он изменится во втором списке.
Используйте конструкторы копирования и избегайте clone()
:
new ArrayList(originalList)
Следует избегать Clone () для массивов, потому что даже если он создает новый экземпляр , он содержит те же элементы . Таким образом, элемент, который изменяется в списке, будет заменен на второй.
Код ниже создаст новый экземпляр с новыми элементами.
ArrayList<Object> clone = new ArrayList<Object>();
for(Object o : originalList)
clone.add(o.clone());
Автор: aran
Размещён: 15.05.2013 10:42
2 плюса
this.listaCompartimentosDEFAULT = new ArrayList<Compartimento>(
listaCompartimentos);
Автор: johnchen902
Размещён: 15.05.2013 10:42
1 плюс
Я бы предложил clone
каждому объекту. Сделайте ваш Compartimento
класс реализующим Cloneable . И клонировать каждый объект в List
и добавить к другому List
.
for(Compartimento c : this.listaCompartimentos) {
this.listaCompartimentosDEFAULT.add(c.clone());
}
Автор: NINCOMPOOP
Размещён: 15.05.2013 11:04
Вопросы из категории :
- java В чем разница между int и Integer в Java и C #?
- java Как я могу определить IP моего маршрутизатора / шлюза в Java?
- java Каков наилучший способ проверки XML-файла по сравнению с XSD-файлом?
- java Как округлить результат целочисленного деления?
- java Преобразование списка <Integer> в список <String>
- java Почему я не могу объявить статические методы в интерфейсе?
- arraylist ArrayList в Java и ввод
- arraylist Создать ArrayList из массива
- arraylist Как удалить повторяющиеся элементы из ArrayList?
- arraylist Когда использовать LinkedList поверх ArrayList в Java?
- arraylist Как посчитать количество вхождений элемента в список
- arraylist Java: Обнаружить дубликаты в ArrayList?
- cloning Как правильно переопределить метод клонирования?
- cloning Создание копии объекта в C #
- cloning Как мне заставить `git clone --recursive` воссоздать пульты и ветви подмодулей?
- cloning Как скопировать ArrayList, на который не могут повлиять исходные изменения ArrayList?
- cloning Могу ли я подключить GIT, если я скачал код в формате ZIP
- cloning Как правильно использовать клонирование объектов?