В чем разница между Set и List?

В чем принципиальная разница между Set<E> а также List<E> интерфейсы?

24 ответа

Решение

List является упорядоченной последовательностью элементов, тогда как Set это отдельный список элементов, который неупорядочен (спасибо, Quinn Taylor).

List<E>:

Упорядоченная коллекция (также известная как последовательность). Пользователь этого интерфейса имеет точный контроль над тем, где в списке каждый элемент вставлен. Пользователь может получить доступ к элементам по их целочисленному индексу (позиции в списке) и искать элементы в списке.

Set<E>:

Коллекция, которая не содержит повторяющихся элементов. Более формально, множества не содержат пары элементов e1 и e2, таких что e1.equals(e2), и не более одного нулевого элемента. Как следует из его названия, этот интерфейс моделирует абстракцию математического набора.

╔═══════════════════╦══════════════════════╦═════════════════════════════╗
║                   ║         List         ║            Set              ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║     Duplicates    ║          YES         ║            NO               ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║       Order       ║       ORDERED        ║  DEPENDS ON IMPLEMENTATION  ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Positional Access ║         YES          ║            NO               ║ 
╚═══════════════════╩══════════════════════╩═════════════════════════════╝

Упорядоченные списки элементов (уникальные или нет)
Соответствует интерфейсу Java с именемList
Доступ к индексу

реализовано с использованием

  • LinkedList
  • ArrayList

Списки уникальных элементов:
Соответствует интерфейсу Java с именемSet
Не может быть доступно по индексу

реализовано с использованием

  • HashSet (неупорядоченный)
  • LinkedHashSet (заказано)
  • TreeSet (отсортировано по естественному порядку или по предоставленному компаратору)

Оба интерфейса Set а также List соответствовать интерфейсу Java с именем Collection

Набор не может содержать повторяющиеся элементы, в то время как Список может. Список (в Java) также подразумевает порядок.

  • Список - это упорядоченная группа товаров
  • Набор - это неупорядоченная группировка предметов без дубликатов (обычно)

Концептуально мы обычно ссылаемся на неупорядоченную группировку, которая допускает дублирование как Мешок и не допускает дублирование как Набор.

Список:

ListКак правило, допускается дублирование объектов.Lists должны быть упорядочены и поэтому доступны по индексу.

Классы реализации включают в себя: ArrayList, LinkedList, Vector

Задавать:

Sets не позволяют дублировать объекты. Большинство реализаций неупорядочены, но это зависит от реализации.

Классы реализации включают в себя: HashSet (неупорядоченный), LinkedHashSet (приказал), TreeSet (заказано естественным заказом или предоставленным компаратором)

Список

  1. Упорядоченная группировка элементов.
  2. Список используется для сбора элементов с дубликатами.
  3. Новые методы определены внутри интерфейса List.

Задавать

  1. Неупорядоченная группировка элементов.
  2. Набор используется для сбора элементов без дубликатов.
  3. В интерфейсе Set не определены новые методы, поэтому мы должны использовать методы интерфейса Collection только с подклассами Set.

Список:
Список позволяет дублировать элементы и нулевые значения. Легко искать, используя соответствующий индекс элементов, а также он будет отображать элементы в порядке вставки. Пример:(LinkedList)

import java.util.*;

public class ListExample {

 public static void main(String[] args) {
    // TODO Auto-generated method stub

    List<Integer> l=new LinkedList<Integer>();
    l.add(001);
    l.add(555);
    l.add(333);
    l.add(888);
    l.add(555);
    l.add(null);
    l.add(null);

    Iterator<Integer> il=l.iterator();

    System.out.println(l.get(0));

    while(il.hasNext()){
        System.out.println(il.next());
    }

    for(Integer str : l){
        System.out.println("Value:"+str);
    }
 }

}

Выход:

1
1
555
333
888
555
ноль
ноль
Значение:1
Значение: 555
Значение:333
Значение:888
Значение: 555
Значение: нулевой
Значение: нулевой

Задавать:
Set не допускает дублирования элементов и допускает одно нулевое значение. Он не будет поддерживать порядок отображения элементов. Только TreeSet будет отображаться в порядке возрастания.

Пример:(TreeSet)

import java.util.TreeSet;

public class SetExample {

 public static void main(String[] args) {
    // TODO Auto-generated method stub

    TreeSet<String> set = new TreeSet<String>();
    try {
        set.add("hello");
        set.add("world");
        set.add("welcome");
        set.add("all");

        for (String num : set) {
            System.out.println( num);

        }
        set.add(null);
    } catch (NullPointerException e) {
        System.out.println(e);
        System.out.println("Set doesn't allow null value and duplicate value");
    }

 }

}

Выход:

все
Привет
добро пожаловать
Мир
java.lang.NullPointerException
Set не допускает нулевое значение и дублирующее значение

List и Set оба являются интерфейсами. Оба они расширяют интерфейс Collection. Важные различия между набором и списком:

  1. Повторяющиеся объекты

Основное различие между List и Set состоит в том, что List допускает дублирование, а Set не допускает дубликатов.

  1. порядок

Список - это упорядоченная коллекция, в которой поддерживается порядок вставки, что означает, что при отображении содержимого списка элементы будут отображаться в том же порядке, в котором они были вставлены в список.

Set - это неупорядоченная коллекция, в ней нет порядка. Существует несколько реализаций Set, которые поддерживают порядок, например LinkedHashSet (он поддерживает элементы в порядке вставки).

  1. Нулевые элементы

Список допускает любое количество нулевых элементов. Set может иметь не более одного нулевого элемента.

Список:

  1. Список упорядоченных группирующих элементов
  2. Список обеспечивает позиционный доступ к элементам коллекций.
  3. Мы можем хранить повторяющиеся элементы в int list.
  4. Список реализует ArrayList, LinkedList, Vector и Stack.
  5. Список может хранить несколько нулевых элементов.

Задавать:

  1. Неупорядоченные группирующие элементы.
  2. Set не предоставляет позиционный доступ к элементам коллекций.
  3. Мы не можем хранить повторяющиеся элементы в наборе.
  4. Установите реализацию интерфейсов HashSet и LinkedHashSet.
  5. Set может хранить только один нулевой элемент.

Поскольку мы говорим об интерфейсах Java, почему бы не взглянуть на Javadoc?!

  • List упорядоченная коллекция (последовательность), которая обычно допускает дублирование
  • Set Коллекция a, которая не содержит повторяющихся элементов, порядок итераций может быть гарантирован реализацией

Нет никакого упоминания об отсутствии порядка в отношении множеств: это зависит от реализации.

Набор - это неупорядоченная группа отдельных объектов - повторяющиеся объекты не допускаются. Обычно он реализуется с использованием хеш-кода вставляемых объектов. (Конкретные реализации могут добавлять порядок, а сам интерфейс Set - нет.)

Список - это упорядоченная группа объектов, которые могут содержать дубликаты. Это может быть реализовано с ArrayList, LinkedList, так далее.

Это может быть не тот ответ, который вы ищете, но JavaDoc классов коллекций на самом деле довольно нагляден. Копировать / вставить:

Упорядоченная коллекция (также известная как последовательность). Пользователь этого интерфейса имеет точный контроль над тем, где в списке каждый элемент вставлен. Пользователь может получить доступ к элементам по их целочисленному индексу (позиции в списке) и искать элементы в списке.

В отличие от наборов, списки обычно допускают дублирование элементов. Более формально списки обычно допускают пары элементов e1 и e2, например e1.equals(e2), и они обычно допускают наличие нескольких нулевых элементов, если они вообще допускают нулевые элементы. Не исключено, что кто-то захочет реализовать список, который запрещает дубликаты, генерируя исключения времени выполнения, когда пользователь пытается вставить их, но мы ожидаем, что такое использование будет редким.

Список против множества

1) Набор не допускает дублирования. Список позволяет дублировать. Основываясь на реализации Set, он также поддерживает порядок вставки.

например: LinkedHashSet, Это поддерживает порядок вставки. Пожалуйста, обратитесь нажмите здесь

2) содержит метод. По своей природе набор будет иметь лучшую производительность для доступа. В лучшем случае это o(1). Но у Списка есть проблема производительности, чтобы вызвать contains,

1.List позволяет дублировать значения и установить не разрешать дубликаты

2.List поддерживает порядок, в котором вы вставили элементы в список Set, не поддерживает порядок. 3.List - упорядоченная последовательность элементов, тогда как Set - это отдельный список элементов, который неупорядочен.

Несколько заметных различий между List и Set в Java приведены ниже:

1) Принципиальное различие между списком и множеством в Java - наличие дублирующих элементов. Список в Java допускает дублирование, а Set не допускает дублирование. Если вы вставите дубликат в Set, он заменит старое значение. Любая реализация Set в Java будет содержать только уникальные элементы.

2) Еще одно существенное различие между List и Set в Java - это порядок. Список - это упорядоченная коллекция, а набор - неупорядоченная коллекция. Список поддерживает порядок вставки элементов, означает, что любой элемент, который вставлен до этого, будет иметь более низкий индекс, чем любой элемент, который вставлен после. Набор в Java не поддерживает порядок. Хотя Set предоставляет другую альтернативу, называемую SortedSet, которая может хранить элементы Set в определенном порядке сортировки, определенном методами Comparable и Comparator объектов, хранящихся в Set.

3) Популярная реализация интерфейса List в Java включает ArrayList, Vector и LinkedList. В то время как популярная реализация интерфейса Set включает HashSet, TreeSet и LinkedHashSet.

Совершенно очевидно, что если вам нужно поддерживать порядок вставки или объект, и ваша коллекция может содержать дубликаты, то List - это путь. С другой стороны, если ваше требование состоит в том, чтобы поддерживать уникальную коллекцию без каких-либо дубликатов, то Set - это путь.

Все List классы поддерживают порядок вставки. Они используют разные реализации, основанные на производительности и других характеристиках (например, ArrayList за скорость доступа к определенному индексу, LinkedList просто для поддержания порядка). Поскольку ключа нет, дубликаты разрешены.

Set классы не поддерживают порядок вставки. Они могут по желанию наложить определенный порядок (как с SortedSet), но обычно имеют определенный порядок реализации, основанный на некоторой хэш-функции (как с HashSet). поскольку SetДоступ к ключам, дубликаты не допускаются.

Самое большое отличие - это основная концепция.

Из интерфейса Set and List. Набор - понятие математики. Метод Set расширяет коллекцию, но не добавляет новый метод. size() означает количество элементов (больше BitSet.cardinality, Linear counter,Log Log,HyperLogLog). addAll() означает объединение. keepAll() означает пересечение. removeAll() означает разницу.

Однако список не хватает этих понятий. Список добавляет множество методов для поддержки концепции последовательности, которую интерфейс Collection не предоставляет. основная концепция - ИНДЕКС. например add(index,element),get(index),search(indexOf()),remove(index) element. В списке также есть подсписок " Просмотр коллекции ". Набор не имеет просмотра. не имеют позиционного доступа. Список также предоставляет множество алгоритмов в классе Collections. sort (Список),binarySearch(Список), обратный (Список), перемешать (Список), заполнить (Список). Параметры метода - это интерфейс List. повторяющиеся элементы - это просто результат концепций. не принципиальная разница.

Итак, существенная разница в концепции. Набор - это концепция набора математики. Список - это понятие последовательности.

Набор: Набор не может иметь дублирующихся элементов в своих коллекциях. это также неупорядоченная коллекция. Чтобы получить доступ к данным из Set, требуется использовать только итератор, и получение на основе индекса для него невозможно. Он в основном используется всякий раз, когда требуется сбор уникальности.

Список: Список может иметь повторяющиеся элементы с упорядоченным натуральным порядком при вставке. Таким образом, могут быть получены данные на основе индекса или итератора. Он широко используется для хранения коллекции, доступ к которой требуется на основе индекса.

Список:

  1. Разрешенные дубликаты.
  2. Упорядочены в элементах группировки.(Другими словами, имеют определенный порядок. Не нужно сортировать в порядке возрастания)

Задавать:

  1. Не допускаются дубликаты.
  2. Неупорядочено в элементах группировки.(Другими словами, не имеет определенного порядка. Может располагаться или не располагаться в порядке возрастания)

Set<E> а также List<E> оба используются для хранения элементов типа E, Разница в том, что Set хранится в неупорядоченном виде и не допускает дублирования значений. List используется для хранения элементов упорядоченным образом и допускает дублирование значений.

Set элементы не могут быть доступны по позиции индекса, и List элементы могут быть доступны с индексной позиции.

Порядок... у списка есть заказ, у набора нет.

Привет. Так много ответов уже дано. Позвольте мне указать на некоторые моменты, которые пока не упомянуты:

  • Большинство реализаций List (ArrayList,Vector) реализуютRandomAccess интерфейс, который является интерфейсом маркера для более быстрого доступа. Ни одна из реализаций List не делает этого.
  • Список использует один специальный итератор под названием ListIterator который поддерживает итерацию в обоих направлениях. Set использует Iterator, который поддерживает только одностороннюю итерацию
  • HashSet занимает 5,5 раз больше памяти, чем ArrayList для хранения того же количества элементов.

Разница основана на следующих пунктах

1) Двуличность: список позволяет дублировать элементы. Любое количество повторяющихся элементов может быть вставлено в список, не затрагивая те же существующие значения и их индексы. Набор не допускает дублирования. Set и все классы, которые реализуют интерфейс Set, должны иметь уникальные элементы.

2) Нулевые значения: Список допускает любое количество нулевых значений. Set допускает не более одного значения NULL.

3) Порядок: List и все его классы реализации поддерживают порядок вставки. Набор не поддерживает порядок; еще немногие из его классов сортируют элементы в таком порядке, как LinkedHashSet поддерживает элементы в порядке вставки.

двуличность

Набор не допускает дублирования. Set и все классы, которые реализуют интерфейс Set, должны иметь уникальные элементы. Список позволяет дублировать элементы. Любое количество повторяющихся элементов может быть вставлено в список, не затрагивая те же существующие значения и их индексы.

Нулевые значения

List allows any number of null values.
Set allows single null value at most

порядок

List и все его классы реализации поддерживают порядок вставки. Set не поддерживает какой-либо порядок, но лишь немногие из его классов сортируют элементы в таком порядке, как LinkedHashSet поддерживает элементы в порядке вставки и TreeSet(элементы поддерживают восходящий порядок по умолчанию)

реализации классов

List: ArrayList, LinkedList 
Set: HashSet, LinkedHashSet, TreeSet 

Вот наглядный пример с Groovy. Я создаю набор и список. Затем я пытаюсь сохранить 20 случайно сгенерированных значений в каждом списке. сгенерированное значение может быть в диапазоне от 0 до 5

s = [] as Set
l = []

max = 5
print "random Numbers :"
20.times{
e = (int)Math.random()*max
s << e
l << e
print "$e, "
}


println "\n"
println "Set : $s "
println "list : $l

Результат:

случайные числа: 4, 1, 4, 0, 1, 2, 4, 0, 0, 3, 4, 3, 2, 0, 4, 0, 1, 3, 1, 3

Задавать: [4, 1, 0, 2, 3]

список: [4, 1, 4, 0, 1, 2, 4, 0, 0, 3, 4, 3, 2, 0, 4, 0, 1, 3, 1, 3]

Вы можете видеть, что разница в том, что:

  • Set не допускает дублирования значений.
  • Список позволяет дублировать значения.

Как и ответ, так как SET не имеет повторяющегося значения, а List может. Конечно, порядок это еще одна вещь, чтобы отличать их друг от друга.

Название темы: Список VS Set

Я только что прошел самую важную тему Java под названием Collections Framework. Я думал поделиться своими маленькими знаниями о коллекциях с вами. Список, Набор, Карта - самая важная тема этого. Итак, начнем с List и Set.

Разница между списком и множеством:

  1. Список - это класс коллекции, который расширяет AbstractList класс, где Set является классом коллекции, который расширяется AbstractSet класс, но оба реализуют интерфейс коллекции.

  2. Интерфейс списка допускает дублирование значений (элементов), тогда как интерфейс Set не допускает дублирования значений. В случае дублирования элементов в Set, он заменяет более старые значения.

  3. Интерфейс списка допускает значения NULL, в то время как интерфейс Set не допускает значения NULL. В случае использования нулевых значений в Set это дает NullPointerException,

  4. Интерфейс списка поддерживает порядок вставки. Это означает, как мы добавляем элементы в список таким же образом, как мы получаем его, используя итератор или для каждого стиля. В то время как Set реализации не обязательно поддерживают порядок вставки. (Хотя SortedSet использует TreeSet, а также LinkedHashSet поддерживает порядок вставки).

  5. Интерфейс List имеет свои собственные определенные методы, тогда как интерфейс Set не имеет своего собственного метода, поэтому Set использует только методы интерфейса Collection.

  6. Интерфейс списка имеет один унаследованный класс Vector в то время как интерфейс Set не имеет унаследованного класса

  7. Последнее, но не менее важное... listIterator() Метод может использоваться только для циклического перемещения по элементам внутри List Classes, тогда как мы можем использовать метод iterator() для доступа к элементам Set класса.

Что-нибудь еще мы можем добавить? Пожалуйста, дайте мне знать.

Благодарю.

Задавать:

Не может иметь повторяющихся значений. Порядок зависит от реализации. По умолчанию он не упорядочен. Не может иметь доступ по индексу.

Список:

Может иметь повторяющиеся значения. Упорядочено по умолчанию. Может иметь доступ по индексу.

Другие вопросы по тегам