Это, пожалуй, самый эффективный способ памяти / G C:
List<Item> items = new ArrayList<>(list1.size() + list2.size());
items.addAll(list1);
items.addAll(list2);
Хитрость заключается в том, чтобы обеспечить точное capacity
при создании списка; см. javado c. Это сохраняет любое двойное копирование для «увеличения» целевого списка (т. Е. list
).
Теперь я думал использовать LinkedList
и скопировать конечный узел list1
в заголовок list2
однако, насколько я могу судить из документации, такого метода не существует.
LinkedList
использует больше памяти для каждой записи списка, чем ArrayList
. Не менее чем в 4 раза.
Кроме того, когда вы используете addAll
от одного LinkedList
к другому, вы создаете новые объекты узла списка.
У меня есть 2 больших списка, которые содержат тяжелые объекты ....
вес (размер) объектов не имеет значения. List
содержит ссылки на объекты, а не копии самих объектов.
Есть ли лучший способ объединить 2 списка без перераспределения новой памяти?
Невозможно объединить два экземпляра java.util.List
без выделения дополнительной памяти. Лучшее, что вы можете сделать, - это минимизировать распределение.
С другой стороны ... если вы были готовы реализовать собственную структуру данных связанного списка, вы могли бы объединить два списка вместе с помощью соединяя их. Но вы List
API не допускаете подобных вещей. (Для начала он искажает исходные списки.)
Это правда, что преждевременная оптимизация - это плохо. Однако, если у вас уже есть убедительные доказательства того, что списки будут большими, то это, вероятно, не преждевременно.