Как скопировать ArrayList в Java?

Вы можете достичь этого, сначала установив элемент конфигурации маршрутизатора в файле конфигурации (файл по умолчанию находится в application / config / config.php ), например:

$config['routes']['insertUser'] = 'users/add';
[ 114], затем предоставьте конфигурацию выше в элемент стандартных маршрутов на rout.php ,

$route[$this->config->item('routes')['insertUser']]['post'] = 'UserController/insert';

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

Так что каждый раз, когда вам нужно изменить маршрут, вы просто изменяете в config.php .

9
задан sblundy 19 November 2008 в 20:06
поделиться

9 ответов

Я думаю, что Вы должны .clone() отдельные объекты. Клонирование ArrayList не "глубоко"; это только клонирует ссылки на объект.

12
ответ дан 4 December 2019 в 06:23
поделиться

Зависит, в чем Вы нуждаетесь. Мелкая копия (объекты в списке являются ссылками на то же как в оригинале):

ArrayList backup = new ArrayList(mylist.size());
backup.addAll(mylist);

Глубокая копия (объекты являются копиями также):

ArrayList backup = new ArrayList(mylist.size());
for(Object o : mylist) {
    backup.add(o.clone());
}
3
ответ дан 4 December 2019 в 06:23
поделиться

Ваш вопрос не очень ясен. При клонировании () ArrayList клон не будет изменен при изменении содержания оригинала (т.е. если Вы добавите или удалите элементы), но это - "мелкая копия" поэтому при изменении фактических объектов в оригинале, они будут также изменены в клоне.

Если Вы хотите сделать "глубокую копию", так, чтобы изменения в фактических объектах не влияли на резервные копии их в клоне, то необходимо создать новый ArrayList и затем пройти исходный и для каждого элемента, клонировать его в новый. Как в

ArrayList backup = new ArrayList();
for (Object obj : data)
   backup.add(obj.clone());
15
ответ дан 4 December 2019 в 06:23
поделиться

Все эти процессы делают мелкие копии. При изменении свойств объектов с в массиве два массива имеют ссылки на тот же экземпляр.

List org = new java.util.ArrayList();
org.add(instance)
org.get(0).setValue("org val");
List copy = new java.util.ArrayList(org);
org.get(0).setValue("new val");

copy.get(0).getValue() возвратится "new val" также, потому что org.get(0) и copy.get(0) возвратите тот же самый экземпляр. Необходимо выполнить глубокую копию как так:

List copy = new java.util.ArrayList();
for(Instance obj : org) {
    copy.add(new Instance(obj)); // call to copy constructor
}
4
ответ дан 4 December 2019 в 06:23
поделиться

Я принимаю data название ArrayList Вы хотели скопировать. Если так, необходимо знать это clone не глубоко - это только создает копию объекта, на который это вызывается, который в этом случае является списком. Если бы это был глубокий клон, то это заполнило бы новый список клонами объектов в нем.

Так как это не глубоко при изменении объектов, список содержит, затем список резервного копирования покажет те изменения также, так как это содержит те же объекты. Единственное время Вы не будете видеть изменений в резервном копировании после изменения "текущего" списка, - когда Вы добавляете или удаляете объекты из текущего списка.

Некоторые классы могут переопределить clone быть глубоким, но не все. В целом это не что-то, на что можно полагаться. При создании резервной копии наборов Java не забудьте или клонировать содержащие в нем объекты также или соглашение только с наборами неизменных объектов.

8
ответ дан 4 December 2019 в 06:23
поделиться

Это звучит (если я интерпретирую Ваш вопрос правильно; это немного жестко) как, Вы не копируете данные, к которым Вы обращаетесь в Вашем ArrayList к Вашему резервному копированию; Вы копируете ссылку.

Трудно сказать точно, как решить Вашу проблему, не зная то, что Ваш тип данных - то, что Вы храните / резервное копирование, но просто быть уверенными, что Вы копируете элементы данных, содержавших в ArrayList. Это означало бы, среди прочего, делать, вещам нравится, выполняют клон () на элементах списка, но не на ArrayList (потому что это создаст новый клонированный список с копиями ссылок на те же объекты).

1
ответ дан 4 December 2019 в 06:23
поделиться

Относительно клонирующейся проблемы, после того как я решил, это путем сериализации всего набора в строку, затем сериализирующую ее, отступает в новый объект. Это вынуждает Вас сделать все свои объекты сериализуемыми и взять, когда два объекта действительно хотят сослаться на единственный третий объект, но это может быть довольно хороший баланс простоты и полноценности.

На самом деле я не попробовал это, но Вы могли, вероятно, использовать канал для сериализации в и в то же точное время так, чтобы Вы не хранили 3 копии в памяти (если это - огромный набор),

0
ответ дан 4 December 2019 в 06:23
поделиться

Я еще не попробовал его, но я думаю, что Collections.copy сделает это.

[РЕДАКТИРОВАНИЕ] Теперь, я попробовал:

static String GetRandomString(int length)
{
  UUID uuid = UUID.randomUUID();
  return uuid.toString().substring(0, length);  
}

public static void main(String[] args)
{
  ArrayList<String> al = new ArrayList<String>(20);
  for (int i = 0; i < 10; i++)
  {
    al.add(GetRandomString(7));
  }
  ArrayList<String> cloneArray = new ArrayList<String>(al);
  Collections.copy(cloneArray, al);
  System.out.println(al);
  System.out.println(cloneArray);
  for (int i = 9; i >= 0; i -= 2)
  {
    al.remove(i);
  }
  System.out.println(al);
  System.out.println(cloneArray);
}
-1
ответ дан 4 December 2019 в 06:23
поделиться

Вы могли записать объект, который переносит два ArrayLists. Что-либо пишет это так, чтобы это добавило, удалило и изменило данные в обоих одновременно.

-3
ответ дан 4 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: