Простой вопрос на Java о ссылках на элемент ArrayList - PullRequest
1 голос
/ 30 марта 2011

Скажите, у меня есть следующий код,

LinkedList partials = new LinkedList();
partials.add(new ArrayList());
ArrayList head = partials.element();
head.add("Test");

Я хочу, чтобы "head" была просто копией Arraylist, являющейся результатом partials.element (). Тем не менее, теперь, когда я делаю изменения в «голову», это отражается в частичных Arraylist. Как мне сделать копию Arraylist, которая является первым элементом партиалов, так что внесение изменений в Arraylist не будет отражено в партиалах?

Ответы [ 2 ]

7 голосов
/ 30 марта 2011

На ум приходят два варианта:

  • Вызовите конструктор ArrayList, который берет другую коллекцию - это сделает копию
  • Вызов clone() на ArrayList

Обратите внимание, что оба из них создадут мелкие копии - каждый список будет содержать ссылки на одни и те же объекты.Хорошо, если они неизменяемы (например, строки), но если вы хотите создать более глубокую копию, вам нужно проделать дополнительную работу.

Кстати, есть ли причина, по которой вы не используете непатентованные средства?Например, я бы, вероятно, использовал:

LinkedList<ArrayList<String>> partials = new LinkedList<ArrayList<String>>();
ArrayList<String> list = new ArrayList<String>();
list.add("Test");

// Create a shallow copy and add a reference to that into the linked list
partials.add(new ArrayList<String>(list));

list.add("Another element");

// Prints 1, because the lists are distinct
System.out.println(partials.element().size());

Если ничто не должно изменить содержимое списков в связанном списке, вы можете посмотреть на неизменяемые коллекции, доступные в Guava или оберните ваш клон, используя Collections.unmodifiableList.Обратите внимание, что последний создает только представление в исходном списке, поэтому вам все равно придется сначала выполнить шаг клонирования.

1 голос
/ 30 марта 2011

на самом деле код не может быть скомпилирован в строке 3: partials.element () возвращает объект (первый элемент вашего LinkedList), и вы должны привести его к типу ArrayList, если хотите использовать его таким образом.

Я согласен, вам не нужны дженерики для облегчения добавления кода.Вы также можете определить частичные имена и заголовок как List вместо LinkedList & ArrayList.Рекомендуется использовать интерфейс вместо реализаций и избегать использования слишком специфического метода, такого как element (), когда вам это не нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...