Найти в Дзене

Установка против списка в Java

Оглавление

1. Обзор

В этом руководстве мы обсудим различия между Set и List в Java на простом примере.

2. Концептуальная разница

И List, и Set являются членами коллекций Java. Однако есть несколько важных отличий:

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

Обратите внимание, что существует несколько реализаций интерфейса Set, поддерживающих порядок, например LinkedHashSet.

3. Пример кода

3.1. Разрешение дубликатов

Добавление повторяющегося элемента разрешено для списка. Однако это не для набора:

@Test
public void givenList_whenDuplicates_thenAllowed(){
List<Integer> integerList = new ArrayList<>();
integerList.add(2);
integerList.add(3);
integerList.add(4);
integerList.add(4);
assertEquals(integerList.size(), 4);
}

@Test
public void givenSet_whenDuplicates_thenNotAllowed(){
Set<Integer> integerSet = new HashSet<>();
integerSet.add(2);
integerSet.add(3);
integerSet.add(4);
integerSet.add(4);
assertEquals(integerSet.size(), 3);
}

3.2. Ведение порядка размещения

Набор поддерживает порядок в зависимости от реализации. Например, для HashSet не гарантируется сохранение порядка, а для LinkedHashSet — да. Давайте посмотрим на пример заказа с LinkedHashSet:

@Test
public void givenSet_whenOrdering_thenMayBeAllowed(){
Set<Integer> set1 = new LinkedHashSet<>();
set1.add(2);
set1.add(3);
set1.add(4);
Set<Integer> set2 = new LinkedHashSet<>();
set2.add(2);
set2.add(3);
set2.add(4);
Assert.assertArrayEquals(set1.toArray(), set2.toArray());
}

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

4. Вывод

В этом руководстве мы увидели разницу между списком и набором в Java.

Оригинал статьи: https://www.baeldung.com/java-set-vs-list#1-allowing-duplicates