Как мне скопировать содержимое одного ArrayList в другой? - PullRequest
74 голосов
/ 09 декабря 2011

У меня есть некоторые структуры данных, и я хотел бы использовать одну как временную, а другую как временную.

ArrayList<Object> myObject = new ArrayList<Object>();
ArrayList<Object> myTempObject = new ArrayList<Object>();


//fill myTempObject here
....

//make myObject contain the same values as myTempObject
myObject = myTempObject;

//free up memory by clearing myTempObject
myTempObject.clear();

теперь проблема с этим, конечно, в том, что myObject действительно просто указывает на myTempObject, и поэтому, когда myTempObject очищено, то myObject.

Как мне сохранить значения из myTempObject в myObject, используя Java?

Ответы [ 11 ]

121 голосов
/ 09 декабря 2011

Вы можете использовать такой трюк:

myObject = new ArrayList<Object>(myTempObject);

или использовать

myObject = (ArrayList<Object>)myTempObject.clone();

Вы можете получить некоторую информацию о методе clone () здесь

Но вы должны помнить, что все эти способы дадут вам копию вашего Списка , а не всех его элементов.Поэтому, если вы измените один из элементов в вашем скопированном Списке, он также будет изменен в вашем исходном Списке.

38 голосов
/ 13 марта 2015

originalArrayList. addAll (copyArrayList);

Обратите внимание : при использовании метода addAll () для копирования содержимое обоих списков массивов (originalArrayList)и copyArrayList) ссылаются на одни и те же объекты или содержимое.Поэтому, если вы измените любой из них, другой также отразит то же самое изменение.

Если вы не хотите этого, вам нужно скопировать каждый элемент из originalArrayList в copyArrayList, как при использовании forили цикл while.

16 голосов
/ 09 декабря 2011

В java нет неявных копий, сделанных с помощью оператора присваивания.Переменные содержат эталонное значение (указатель), и когда вы используете =, вы копируете только это значение.

Чтобы сохранить содержимое myTempObject, вам необходимо сделать его копию.

Это может быть сделано путем создания нового ArrayList с использованием конструктора, который принимает другой ArrayList:

ArrayList<Object> myObject = new ArrayList<Object>(myTempObject);

Редактировать: Как указывает Богемский в комментарияхниже, это то, что вы спрашиваете?При выполнении вышеизложенного оба ArrayList s (myTempObject и myObject) будут содержать ссылки на одинаковые объекты.Если вы действительно хотите новый список, который содержит новые копии объектов, содержащихся в myTempObject, то вам нужно будет сделать копию каждого отдельного объекта в оригинале ArrayList

8 голосов
/ 10 апреля 2015

Я сталкивался с этим, когда сталкивался с той же самой проблемой.

Говоря arraylist1 = arraylist2 устанавливает их обоих так, чтобы они указывали на одно и то же место, поэтому, если вы изменяете либо данные, то и оба списка всегда остаются одинаковыми.

Чтобы скопировать значения в независимый список, я просто использовал foreach, чтобы скопировать содержимое:

ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();

заполнить список1 любым способом, которым вы сейчас являетесь.

foreach(<type> obj in list1)
{
    list2.Add(obj);
}
4 голосов
/ 27 октября 2017

Давайте попробуем пример

     ArrayList<String> firstArrayList = new ArrayList<>();
            firstArrayList.add("One");
            firstArrayList.add("Two");
            firstArrayList.add("Three");
            firstArrayList.add("Four");
            firstArrayList.add("Five");
            firstArrayList.add("Six");
            //copy array list content into another array list
             ArrayList<String> secondArrayList=new ArrayList<>();
            secondArrayList.addAll(firstArrayList);
            //print all the content of array list
            Iterator itr = secondArrayList.iterator();
            while (itr.hasNext()) {
                System.out.println(itr.next());
            }

В печати Вывод как показано ниже

One
Два
Три
Четыре
Пять
Шесть

Мы также можем сделать это с помощью метода clone () , для которого используется точная копия

для этой попытки вы можете попробовать как

 **ArrayList<String>secondArrayList = (ArrayList<String>) firstArrayList.clone();**
    And then print by using iterator
      **Iterator itr = secondArrayList.iterator();
                while (itr.hasNext()) {
                    System.out.println(itr.next());
                }**
4 голосов
/ 06 января 2016

Предположим, вы хотите скопировать oldList в новый объект ArrayList с именем newList

ArrayList<Object> newList = new ArrayList<>() ;

for (int i = 0 ; i<oldList.size();i++){
    newList.add(oldList.get(i)) ;
}

Эти два списка являются независимыми, изменения одного не отражаются в другом.

3 голосов
/ 09 декабря 2011

Вам необходимо clone() отдельный объект.Constructor и другие методы выполнения мелкого копирования.Вы можете попробовать Collections.copy метод.

1 голос
/ 23 ноября 2017

Простой способ сделать полную копию оригинального списка - добавить все элементы из одного списка в другой список.

ArrayList<Object> originalList = new ArrayList<Object>();
ArrayList<Object> duplicateList = new ArrayList<Object>();

for(Object o : originalList) {
    duplicateList.add(o);
}

Теперь Если вы внесете какие-либо изменения в originalList, это не повлияет на duplicateList.

0 голосов
/ 23 марта 2019

Вот обходной путь для копирования всех объектов из одного arrayList в другой:

 ArrayList<Object> myObject = new ArrayList<Object>();
ArrayList<Object> myTempObject = new ArrayList<Object>();

myObject.addAll(myTempObject.subList(0, myTempObject.size()));

subList предназначен для возврата списка с диапазоном данных.так что вы можете скопировать весь arrayList или его часть.

0 голосов
/ 15 ноября 2017

Копировать один список во второй довольно просто, вы можете сделать это, как показано ниже: -

ArrayList<List1> list1= new ArrayList<>();
ArrayList<List1> list2= new ArrayList<>();
//this will your copy your list1 into list2
list2.addAll(list1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...