У меня есть несколько структур данных, и я хотел бы использовать одну как временную, а другую как временную.
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
. Но если вам нужно сохранить все объекты, очистка временного списка на самом деле не очистит весь объем памяти. Потому что вы только пытаетесь очистить ссылки, насколько объекты вы пытаетесь сохранить.Ответы:
Можно использовать такой прием:
myObject = new ArrayList<Object>(myTempObject);
или используйте
Вы можете получить некоторую информацию о методе clone () здесь
Но вы должны помнить, что все эти способы предоставят вам копию вашего списка , а не всех его элементов. Поэтому, если вы измените один из элементов в своем скопированном списке, он также будет изменен в исходном списке.
источник
Object
не укажете Java, что нужно копировать что-то производное, всегда будет назначаться по ссылке. Между прочимclone()
, это неглубокая копия и будет копировать не содержащиеся,Objects
а скорее ссылки на них. Если вы хотите сделать глубокую копию, взгляните на: stackoverflow.com/questions/64036/…oldList = newList
?originalArrayList. addAll (copyArrayList);
Обратите внимание : при использовании метода addAll () для копирования содержимое обоих списков массивов (originalArrayList и copyArrayList) относится к одним и тем же объектам или содержимому. Поэтому, если вы измените один из них, другой также отразит то же изменение.
Если вы этого не хотите, вам нужно скопировать каждый элемент из originalArrayList в copyArrayList, например, используя цикл for или while.
источник
В java нет неявных копий с помощью оператора присваивания. Переменные содержат ссылочное значение (указатель), и когда вы используете,
=
вы копируете только это значение.Чтобы сохранить содержимое,
myTempObject
вам необходимо сделать его копию.Это можно сделать, создав новый
ArrayList
с помощью конструктора, который принимает другойArrayList
:ArrayList<Object> myObject = new ArrayList<Object>(myTempObject);
Изменить: как Bohemian указывает в комментариях ниже, это то, о чем вы спрашиваете? При выполнении вышеизложенного оба
ArrayList
s (myTempObject
иmyObject
) будут содержать ссылки на одни и же объекты. Если вам действительно нужен новый список, содержащий новые копии содержащихся в нем объектов,myTempObject
вам нужно будет сделать копию каждого отдельного объекта в оригинале.ArrayList
источник
clear()
наArrayList
myTempObject
не будет иметь никакого влияния на объекты , содержащиеся Тэрин. Если ему нужны новые копии объектов, содержащихся в списке, это уже другая история, но я не так истолковал этот вопрос.Я столкнулся с этим, когда столкнулся с той же проблемой.
Сказав Arraylist1 = Arraylist2, они оба будут указывать на одно и то же место, поэтому, если вы измените любое из них, данные изменятся, и, таким образом, оба списка всегда останутся неизменными.
Чтобы скопировать значения в независимый список, я просто использовал foreach для копирования содержимого:
ArrayList list1 = new ArrayList(); ArrayList list2 = new ArrayList();
заполните list1 тем способом, которым вы сейчас являетесь.
источник
Предположим, вы хотите скопировать oldList в новый объект ArrayList с именем newList
ArrayList<Object> newList = new ArrayList<>() ; for (int i = 0 ; i<oldList.size();i++){ newList.add(oldList.get(i)) ; }
Эти два списка независимы, изменения в одном не отражаются в другом.
источник
Давайте попробуем пример
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()); }**
источник
Вам нужен
clone()
индивидуальный объект.Constructor
и другие методы выполняют мелкое копирование. Вы можете попробовать метод Collections.copy .источник
Collections.copy
сломан. Во-первых, он вводит в заблуждение, говоря, что копирует элементы, тогда как ссылается на них только в новом списке. Во-вторых, у вас уже должен быть список адресатов размером не ниже исходного списка ...Самый простой способ сделать полную копию исходного списка - это добавить все элементы из одного списка в другой.
ArrayList<Object> originalList = new ArrayList<Object>(); ArrayList<Object> duplicateList = new ArrayList<Object>(); for(Object o : originalList) { duplicateList.add(o); }
Теперь, если вы внесете какие-либо изменения в originalList, это не повлияет на duplicateList.
источник
чтобы скопировать один список в другой, вы можете использовать метод под названием Collection.copy (myObject myTempObject). Теперь после выполнения этой строки кода вы можете увидеть все значения списка в myObject.
источник
ArrayList<List1> list1= new ArrayList<>(); ArrayList<List1> list2= new ArrayList<>(); //this will your copy your list1 into list2 list2.addAll(list1);
источник
Вот обходной путь для копирования всех объектов из одного arrayList в другой:
ArrayList<Object> myObject = new ArrayList<Object>(); ArrayList<Object> myTempObject = new ArrayList<Object>(); myObject.addAll(myTempObject.subList(0, myTempObject.size()));
subList предназначен для возврата списка с диапазоном данных. так что вы можете скопировать весь arrayList или его часть.
источник
Предположим, у вас есть два 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 );
Готово!!
источник