Как объединить два списка (List) в Java? Простые и эффективные способы
Использование метода addAll() — самый простой способ
Ваше предположение насчёт метода addAll() абсолютно верно. Это стандартный и наиболее часто используемый способ объединения списков в Java. Он добавляет все элементы из указанной коллекции в конец текущего списка. При этом исходные списки остаются нетронутыми, так как addAll() копирует ссылки на объекты (для неизменяемых строк это безопасно).
import java.util.ArrayList;
import java.util.List;
public class MergeListsExample {
public static void main(String[] args) {
List<String> listA = new ArrayList<>();
listA.add("Alice");
listA.add("Bob");
List<String> listB = new ArrayList<>();
listB.add("Charlie");
listB.add("David");
// Создаём новый список и добавляем в него элементы из обоих списков
List<String> mergedList = new ArrayList<>(listA); // Копируем listA
mergedList.addAll(listB); // Добавляем все элементы из listB
System.out.println("Объединённый список: " + mergedList);
// Вывод: [Alice, Bob, Charlie, David]
// Исходные списки не изменились
System.out.println("listA: " + listA); // [Alice, Bob]
System.out.println("listB: " + listB); // [Charlie, David]
}
}
Почему это работает?
- Конструктор
new ArrayList<>(listA)создаёт новый список, содержащий все элементы изlistA. Это защищает исходный список от изменений. - Метод
addAll(listB)добавляет все элементы изlistBв конец нового списка. В результатеmergedListсодержит элементы обоих списков в порядке: сначала изlistA, затем изlistB. - Оба метода работают за O(n) времени, где n — количество добавляемых элементов.
Альтернатива: однострочное решение с помощью Stream API (Java 8+)
Если вы используете Java 8 или новее, можно применить Stream API для более функционального подхода. Этот способ особенно удобен, когда нужно объединить несколько списков или применить дополнительные операции (фильтрацию, сортировку).
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class MergeWithStreams {
public static void main(String[] args) {
List<String> listA = List.of("Alice", "Bob"); // Java 9+ удобная фабрика
List<String> listB = List.of("Charlie", "David");
List<String> mergedList = Stream.concat(listA.stream(), listB.stream())
.collect(Collectors.toList());
System.out.println("Объединённый список: " + mergedList);
// [Alice, Bob, Charlie, David]
}
}
Что выбрать?
addAll()— лучший выбор для простых случаев, когда нужно просто объединить два списка. Код интуитивно понятен и работает во всех версиях Java (начиная с 1.2).- Stream API — подходит, если вы уже используете Java 8+ и хотите писать в функциональном стиле, или когда нужно объединить более двух списков (через
Stream.of(list1, list2, list3).flatMap(List::stream)). - Избегайте ручных циклов — они не только громоздкие, но и менее читаемые. Современная Java предоставляет все необходимые инструменты для лаконичной работы с коллекциями.
Важно помнить: если вы работаете с изменяемыми объектами (например, List<StringBuilder>), то addAll() и Stream API копируют только ссылки. Изменение объекта через ссылку в объединённом списке затронет и исходный список. Для полного копирования используйте глубокое копирование (deep copy), но для строк это неактуально, так как они иммутабельны.
Использование ListUtils из Apache Commons Collections
Если в вашем проекте уже используется библиотека Apache Commons Collections, вы можете воспользоваться утилитным классом ListUtils. Это может быть удобно, когда нужно объединить списки без создания временных коллекций вручную.
import org.apache.commons.collections4.ListUtils;
import java.util.ArrayList;
import java.util.List;
public class MergeWithCommons {
public static void main(String[] args) {
List<String> listA = new ArrayList<>();
listA.add("Alice");
listA.add("Bob");
List<String> listB = new ArrayList<>();
listB.add("Charlie");
listB.add("David");
// Метод union создаёт новый список, содержащий элементы из обоих списков
List<String> mergedList = ListUtils.union(listA, listB);
System.out.println("Объединённый список: " + mergedList);
// [Alice, Bob, Charlie, David]
}
}
Важные нюансы
- Зависимость: Для использования
ListUtilsнеобходимо добавить в проект зависимостьorg.apache.commons:commons-collections4. Это может быть избыточно, если вы используете только этот метод. - Поведение: Метод
unionработает аналогичноaddAll()— он создаёт новый список и копирует в него элементы. Исходные списки не изменяются. - Производительность: Поскольку внутри используется тот же механизм, что и в стандартном
addAll(), производительность сопоставима. Однако дополнительная библиотека может увеличить размер приложения. - Альтернативы: Если вы не хотите подключать библиотеку, придерживайтесь чистого Java-решения с
addAll()или Stream API. Для большинства проектов этого более чем достаточно.
Таким образом, ListUtils.union() — это удобная обёртка, но она оправдана только в том случае, если вы уже используете Apache Commons Collections в проекте. В противном случае лучше остановиться на стандартных средствах Java.
Ответов пока нет.
Войдите чтобы оставить ответ
Блоги
Паттерны проектирования в Go с примерами для разработчиков