Как скопировать ArrayList, на который не могут повлиять исходные изменения ArrayList?

java arraylist cloning

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
Вопросы из категории :
32x32