Как скопировать содержимое одного ArrayList в другой?


85

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

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?


Вы можете использовать List.addAll. Но если вам нужно сохранить все объекты, очистка временного списка на самом деле не очистит весь объем памяти. Потому что вы только пытаетесь очистить ссылки, насколько объекты вы пытаетесь сохранить.
Bhesh Gurung

Насколько мне известно, этот ответ все еще действителен: stackoverflow.com/questions/715650/…
главная

2
Трудно интерпретировать то, чего вы действительно пытаетесь достичь. Вам нужно объяснить вашу ситуацию.
Bhesh Gurung

Ответы:


141

Можно использовать такой прием:

myObject = new ArrayList<Object>(myTempObject);

или используйте

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

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

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


7
Назначение по значению в Java - это то, что зарезервировано для примитивных типов (int, byte, char и т. д.) и литералов. Если вы явно Objectне укажете Java, что нужно копировать что-то производное, всегда будет назначаться по ссылке. Между прочим clone(), это неглубокая копия и будет копировать не содержащиеся, Objectsа скорее ссылки на них. Если вы хотите сделать глубокую копию, взгляните на: stackoverflow.com/questions/64036/…
PeterT

@PeterT - Java это только вызов по и присваивать значения. Переменные непримитивного типа содержат ссылочные значения, которые назначаются или передаются.
Брайан Роуч,

Пожалуйста, почему я не могу oldList = newList?
X09

2
@ X09 oldList = newList скопирует ссылку newList на oldList, любое изменение в newList будет отражено также в oldList. Это не предполагаемое поведение.
Sreekanth Karumanaghat 04

42

originalArrayList. addAll (copyArrayList);

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

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


1
Как остановить влияние на другой список, есть ли другой способ справиться с этим
Махеш

@Mahesh - обратитесь к этому stackoverflow.com/questions/715650/…
KrishPrabakar

17

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

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

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

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

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


1
В этом случае он будет работать нормально , как вызов clear()на ArrayList myTempObjectне будет иметь никакого влияния на объекты , содержащиеся Тэрин. Если ему нужны новые копии объектов, содержащихся в списке, это уже другая история, но я не так истолковал этот вопрос.
Брайан Роуч,

Вы знаете, я думаю, что вы правы. Я неправильно истолковал вопрос. Он боялся, что очистка одного очистит другое. Комментарий удален.
Bohemian

@Bohemian - я думаю, что это был справедливый комментарий, и я отредактировал свой пост, чтобы отразить его. Я не подумал, что это могло быть намерением ОП, читая его вопрос.
Брайан Роуч,

@BrianRoach Как сделать копию ArrayList внутри ArrayList.
Арун,

8

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

Сказав Arraylist1 = Arraylist2, они оба будут указывать на одно и то же место, поэтому, если вы измените любое из них, данные изменятся, и, таким образом, оба списка всегда останутся неизменными.

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

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

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

foreach(<type> obj in list1)
{
    list2.Add(obj);
}

4

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

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

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

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


4

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

     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());
            }

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

Один
два
три
четыре
пять
шесть

Мы также можем сделать, используя 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());
                }**

3

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


Collections.copy сломан. Во-первых, он вводит в заблуждение, говоря, что копирует элементы, тогда как ссылается на них только в новом списке. Во-вторых, у вас уже должен быть список адресатов размером не ниже исходного списка ...
ACV

1

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

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

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

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


0

чтобы скопировать один список в другой, вы можете использовать метод под названием Collection.copy (myObject myTempObject). Теперь после выполнения этой строки кода вы можете увидеть все значения списка в myObject.


0

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

ArrayList<List1> list1= new ArrayList<>();
ArrayList<List1> list2= new ArrayList<>();
//this will your copy your list1 into list2
list2.addAll(list1);

0

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

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

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

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


0

Предположим, у вас есть два arrayylist типа String. подобно

ArrayList<String> firstArrayList ;//This array list is not having any data.

ArrayList<String> secondArrayList = new ArrayList<>();//Having some data.

Теперь нам нужно скопировать данные второго массива в первый массив, вот так:

firstArrayList = new ArrayList<>(secondArrayList );

Готово!!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.