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


416

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



5
И если вы хотите узнать с точки зрения производительности, взгляните на этот вопрос stackoverflow.com/questions/10799417/…
vsingh

Ответы:


504

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

List<E>:

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

Set<E>:

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


7
Для SortedSet не существует двух элементов, где compareTo () == 0, так как equals не вызывается.
Питер Лори

34
Набор МОЖЕТ быть заказан, так что первое утверждение этого ответа вводит в заблуждение, даже если, конечно, список должен быть выбран для обеспечения исполнения
Заказа

24
НЕПРАВИЛЬНО! Набор Java можно заказать в зависимости от реализации; например, упорядочен Java TreeSet. В контексте Java единственное различие между списком и набором состоит в том, что набор содержит уникальные элементы. В контексте математики, элементы набора являются уникальными и неупорядоченными.
stackoverflowuser2010

45
Да, набор Java МОЖЕТ быть НО НЕ ОБЯЗАТЕЛЬНО заказан. Да, если у вас есть TreeSet, вы можете рассчитывать на этот заказ. Но вы должны ЗНАТЬ, что у вас есть TreeSet, а не просто Set. Если вам возвращается набор, вы не можете зависеть от того, что будет заказано. Список, с другой стороны, упорядочен по самой своей природе, и любая реализация List должна быть упорядочена. Таким образом, с точки зрения определения интерфейса, не является особенно ошибочным говорить, что набор неупорядочен, но, возможно, немного более технически правильно сказать, что набор не дает гарантии порядка элементов.
Spanky Quigman

15
Не путайте «заказано» с «отсортировано». Точно так же не объединяйте контракт интерфейса и реализации интерфейса. Также неверно говорить, что что-то «неупорядоченное» не имеет порядка, это просто означает, что нет никаких гарантий относительно выполнения заказа (и что порядок может быть нестабильным между вызовами, в отличие от упорядоченного списка).
lilbyrdie

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

2
Стоит отметить одну вещь: производительность позиционного доступа во многом зависит от базовой реализации, массива и связанного списка stackoverflow.com/questions/322715/…
Кристоф Руссси,

1
Как Индексируются Наборы, если не позиционным доступом? (+1 для ASCII-таблицы)
tplive

72

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

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

  • LinkedList
  • ArrayList

Списки уникальных элементов:
соответствуют интерфейсу Java с именемSet
Can not обращаться по индексу

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

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

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


28

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


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

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


Набор не может иметь дубликатов.
karim79

Некоторые реализации набора упорядочены (например, LinkedHashSet, который поддерживает LinkedList за кулисами). Но Set ADT не имеет порядка.
Майкл Майерс

10

Список

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

Набор

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

10

Список:

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

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

Набор:

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

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


7

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

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

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


2
Правильный. LinkedHashSet содержит элементы в порядке вставки.
ggb667

Это интерфейс, ВСЕ зависит от реализации. List.get () может создать файл, содержащий первые 5 десятичных дробей числа pi, и выдать исключение StackOverFlowException в некоторых реализациях, это не означает, что вы можете сказать «список - это то, что может создавать файлы», поскольку он не является частью контракт определяется интерфейсом. Набор претензий docs смоделирован по математической концепции набора, который по определению не упорядочен. Учитывая набор в вашем коде, вы не можете предполагать, что он упорядочен без нарушения принципов SOLID.
Сара

@kai, я обычно держусь LinkedHashSetлевой стороны, если код опирается на порядок позже. Я использую его только в том Setслучае, если я действительно использую его как единое целое, поскольку вы не можете предположить, что базовая реализация является LinkedHashSetили такой, это может произойти сегодня, но завтра код изменится и произойдет сбой.
Кристоф Русси

Если вы объявляете LinkedHashSet, вы не имеете дело с множеством, поэтому вряд ли уместно делать заявления о том, как наборы должны вести себя. Я бы сказал, что приписывание (возможной) упорядоченности множествам на основе некоторых реализаций сродни утверждению «Экземпляры Runnable имеют метод run, предназначенный для запуска в каком-либо потоке. Также они открывают соединение с БД и читают данные клиента в зависимости от реализации. " Конечно, некоторые реализации могут сделать это, но это не то, что подразумевается под Runnable Interface.
Сара

5

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

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

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


5

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

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


1
Я в замешательстве 😕! Что означает упорядоченный / неупорядоченный в этом контексте? Это связано с возрастающим и убывающим порядком? Если это так, Listне заказано 😕
malhobayyeb

4
Упорядочивается , когда входные данные располагаются точно так, как они были введены пользователем, тогда как Сортировка - когда входные данные сортируются лексикографически или в порядке возрастания / убывания (в терминах целочисленных значений). Неупорядоченный означает, что входные данные могут или не могут быть сохранены в порядке ввода пользователем.
Ахил

5

Список:
Список позволяет дублировать элементы и нулевые значения. Легко искать, используя соответствующий индекс элементов, а также он будет отображать элементы в порядке вставки. Пример: (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
null
null
Значение: 1
Значение: 555
Значение: 333
Значение: 888
Значение: 555
Значение: ноль
Значение: ноль

Set:
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 не позволяет нулевое значение и повторяющееся значение


3

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

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


3

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

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

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

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


2

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

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


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

1

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


2
Set ADT не определяет порядок, но некоторые реализации Set (такие как LinkedHashSet) сохраняют порядок вставки.
Майкл Майерс

3
Тем не менее, более важным отличием является то, что наборы не допускают дублирования. Сумка / мультисеть делает.
Куинн Тейлор

TreeSet имеет порядок.
stackoverflowuser2010

1

Несколько заметных различий между 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 - это путь.


Привет @ Vibha, если я хочу оба условия? Я имею в виду, я не хочу, чтобы мои данные содержали дубликаты, и я также хочу, чтобы они были в порядке.
Панадол Чонг

1

Список:

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

Набор:

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

0

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

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


1
@BalusC, пожалуйста, не комментируйте, не видя дату публикации. Смотрите пост, достойный того времени.
Яша

0

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

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

@smurti, это немного поздно, и я не уверен, что вы заметили, но ваш первый пункт противоречит самому себе: «Большинство реализаций List (ArrayList, Vector) реализуют RandomAccess ...» и «... Ни один из списка реализации делают это "
Питер М

0

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

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

Однако список не хватает этих понятий. Список добавляет много методов для поддержки концепции последовательности, которую интерфейс Collection не предоставляет. Основная концепция - ИНДЕКС . как добавить (индекс, элемент), получить (индекс), поиск (indexOf ()), удалить (индекс) элемент. Список также предоставляет подсписок « Представление коллекции » . Набор не имеет вид. не имеют позиционного доступа. Список также предоставляет множество алгоритмов в классе Коллекции . сортировки (List), BinarySearch (Список), обратный (список), перемешайте (List), заливку (List). Параметр метода является интерфейсом List . повторяющиеся элементы являются просто результатом концепций. не существенная разница.

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


-1

Вот наглядный пример с 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 не допускает дублирования значений.
  • Список позволяет дублировать значения.

1
Списки также поддерживают порядок.
glen3b

-1

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


-1

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

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


-2

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

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

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

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

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

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

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

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

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

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

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

Спасибо.


С одной стороны , Listи Setинтерфейсы , которые также имеют «базовые» внедрения в виде абстрактного класса (которые вы упомянули). Кроме того, # 3 является полностью неточным , так как большинство наборов допускает нулевые значения (но зависит от реализации). Я не понимаю № 5 и № 7, и № 6 Vectorне является устаревшим, а просто синхронизирован и не предпочтителен для использования, кроме случаев, когда необходима синхронизация.
glen3b

-3

Набор:

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

Список:

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.