Восемь различных способов реализации пересечения коллекций списков Java
Восемь различных способов реализации пересечения коллекций списков Java
Способ 1. Используйте Stream API Java 8.

Этот метод использует операции фильтра и сбора Stream API для поиска пересечения двух списков.

Язык кода:javascript
копировать
List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);

List<Integer> intersection = list1.stream()
        .filter(list2::contains)
        .collect(Collectors.toList());

Метод 2: используйте традиционный обход цикла

Этот метод реализует пересечение, проходя по одному списку и проверяя, присутствуют ли его элементы в другом списке.

Язык кода:javascript
копировать
List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);
List<Integer> intersection = new ArrayList<>();

for (Integer item : list1) {
    if (list2.contains(item)) {
        intersection.add(item);
    }
}

использоватьHashSetОптимизировать метод обхода:

Язык кода:javascript
копировать
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class ListIntersection {
    public static void main(String[] args) {
        List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
        List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);

        Set<Integer> set1 = new HashSet<>(list1);
        List<Integer> intersection = new ArrayList<>();

        for (Integer num : list2) {
            if (set1.contains(num)) {
                intersection.add(num);
            }
        }

        System.out.println("Пересечение:" + intersection);
    }
}

Воляlist1Преобразовать вHashSet,для повышения эффективности поиска. Затем,Мы пересекаемlist2,и проверьте, существует ли его элемент вset1середина。если существует,затем добавьте его в список пересечений. пожалуйста, обрати внимание,потому чтоHashSetПорядок элементов не гарантируется,Таким образом, порядок элементов в списке пересечений может отличаться от исходного списка. Если вам нужно сохранить порядок,МожетиспользоватьLinkedHashSetзаменятьHashSet


Способ 3. Используйте метод continueAll Set.

Этот метод сначала преобразует два списка в Set, а затем использует метод continueAll Set для поиска пересечения. Метод saveAll сохраняет элементы, существующие в указанной коллекции (параметрах).

Язык кода:javascript
копировать
List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);

Set<Integer> set1 = new HashSet<>(list1);
Set<Integer> set2 = new HashSet<>(list2);
set1.retainAll(set2); // set1 теперь содержит только элементы пересечения

List<Integer> intersection = new ArrayList<>(set1);

Способ 4. Используйте Java CollectionUtils (коллекции Apache Commons)

Если ваш проект уже включает библиотеку коллекций Apache Commons, вы можете использовать предоставляемый ею класс CollectionUtils, чтобы легко находить пересечения.

Язык кода:javascript
копировать
import org.apache.commons.collections4.CollectionUtils;

List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);

List<Integer> intersection = (List<Integer>) CollectionUtils.intersection(list1, list2);

Примечание: Апач Commons CollectionsБиблиотекасерединаизintersectionМетод возвращаетjava.util.Collectionтип,Поэтому требуется преобразование типов.


Способ 5: используйте Java Stream APIизanyMatch

Уже использовался ранееfilterМетод показываетнравитьсячтоиспользоватьStream API для поиска пересечения,Но его также можно использоватьanyMatchдобиться чего-то вродеиз Функция。но,Обычно этот подход не самый эффективный.,Потому что для каждого элемента требуется проверка обхода.

Язык кода:javascript
копировать
List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);

List<Integer> intersection = list1.stream()
    .filter(item -> list2.stream().anyMatch(item::equals))
    .collect(Collectors.toList());

Примечание. Этот метод имеет более высокую временную сложность.,Потому что дляlist1серединаизкаждый элемент,Он пройдет всюlist2。поэтому,Для больших списков,Этот метод не рекомендуется.


Метод 6: использование параллельных потоков Java 8

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

Язык кода:javascript
копировать
List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);

Set<Integer> set2 = new HashSet<>(list2); // Используйте HashSet для повышения эффективности поиска

List<Integer> intersection = list1.parallelStream()
    .filter(set2::contains)
    .collect(Collectors.toList());

Примечание. Параллельные потоки не всегда быстрее последовательных, особенно при работе с небольшими наборами данных или наборами данных, которые не подходят для параллельной обработки. Кроме того, использование параллельных потоков также увеличит накладные расходы потоков.


Способ 7. Используйте класс инструментов Java для параллелизма.

Если вы имеете дело с очень большими наборами данных,и хотите воспользоваться мощью многоядерных процессоров,Вы можете рассмотреть возможность использования Java-инструментов параллелизма.,нравитьсяForkJoinPool,для расчета пересечения параллельно.

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

Способ 8. Используйте сторонние библиотеки (например, Guava)

Помимо коллекций Apache Commons, другие сторонние библиотеки, такие как Guava, также предоставляют классы инструментов для операций сбора.

Например,использоватьGuavaизSets.intersection(Set<E> set1, Set<E> set2)Методы можно легко найти с помощью двухсобиратьизпересечение:

Язык кода:javascript
копировать
import com.google.common.collect.Sets;

List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);

Set<Integer> set1 = new HashSet<>(list1);
Set<Integer> set2 = new HashSet<>(list2);

Set<Integer> intersectionSet = Sets.intersection(set1, set2);
List<Integer> intersection = new ArrayList<>(intersectionSet);

Уведомление:GuavaизSets.intersectionМетод возвращает Неизменяемыйизвид,Он представляет собой пересечение двух примитивных сборов. Это представление меняется по мере исходного сбора.,Но сам по себе он не занимает дополнительного места. Если вам нужен независимый перекресток, собирайте,Вы можете скопировать в новый ArrayList, как указано выше.

Я надеюсь, что введение и практика вышеупомянутых методов помогут вам лучше понять расчет пересечения коллекций списков в Java и иметь возможность гибко использовать его в реальной разработке.


Навыки обновляются благодаря обмену ими, и каждый раз, когда я получаю новые знания, мое сердце переполняется радостью. Искренне приглашаем вас подписаться на публичный аккаунт код тридцать пять , для получения дополнительной технической информации.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose