Яка різниця між 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 не існує двох елементів, де сравнениеTo () == 0, оскільки дорівнює не називається.
Пітер Лоурі

34
Набір МОЖУТЬ замовити, тож перше твердження цієї відповіді вводить в оману, навіть якщо, звичайно, для
вибору

24
НЕ ПРАВО! Набір Java можна замовити, залежно від реалізації; наприклад, замовляється Java TreeSet. У контексті Java єдиною відмінністю між списком та набором є те, що набір містить унікальні елементи. У контексті математики предмети набору є унікальними та не упорядкованими.
stackoverflowuser2010

44
Так, набір Java МОЖЕ бути, але НЕ НАДАЄТЬСЯ. Так, якщо у вас є TreeSet, ви можете розраховувати на замовлення. Але ви повинні знати, що у вас є TreeSet, а не просто набір. Якщо вам повернуть набір, ви не можете залежати від того, що буде замовлено. Список з іншого боку впорядкований за своєю суттю і будь-яка реалізація Списку повинна бути впорядкована. Отже, на умовах визначення інтерфейсу не особливо неправильно говорити, що набір не упорядкований, але, можливо, трохи технічніше правильно сказати, що набір не гарантує порядок елементів.
Spanky Quigman

14
Не пов'язуйте "замовлене" з "відсортованим". Крім того, не плутайте договір інтерфейсу та його реалізацію. Неправильно також говорити, що те, що є "не упорядкованим", не має порядку, це просто означає, що немає гарантій щодо виконання замовлення (і що замовлення може бути стабільним між дзвінками, на відміну від упорядкованого списку).
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
Можна НЕ звертатися за індексом

реалізовано за допомогою

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

Обидва інтерфейси Setі Listвідповідають інтервалу Java з назвоюCollection


28

Набір не може містити повторюваних елементів, тоді як список може. Список (на Java) також передбачає порядок.


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

Концептуально ми зазвичай посилаємось на не упорядковане групування, яке дозволяє дублікати як «Мішок» і не дозволяє дублікати - це набір.


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

Деякі реалізовані набори впорядковані (наприклад, LinkedHashSet, який підтримує LinkedList поза кадром). Але встановити ADT не має замовлення.
Майкл Майерс

10

Список

  1. Це впорядковане групування елементів.
  2. Список використовується для збирання елементів із дублікатами.
  3. В інтерфейсі списку визначені нові методи.

Встановити

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

10

Список:

Lists, як правило, дозволяють повторювати об'єкти. Lists повинні бути впорядковані, а тому доступні за допомогою індексу.

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

Набір:

Sets не дозволяють дублювати об'єкти. Більшість реалізацій є не упорядкованими, але це конкретно для впровадження.

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


7

Як ми говоримо про інтерфейси Java, чому б не подивитися на Javadoc ?!

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

НЕ згадується відсутність порядку щодо наборів: це залежить від реалізації.


2
Правильно. LinkedHashSet містить елементи в порядку вставки.
ggb667

Це інтерфейс, ВСЕ залежить від реалізації. List.get () може створити файл, що містить перші 5 десяткових знаків pi та викидає StackOverFlowException у деяких реалізаціях, це не означає, що ви можете сказати "Список - це те, що може створювати файли", оскільки це не є частиною договір, визначений інтерфейсом. Набір заявок на документи моделюється за математичним поняттям набору, який за визначенням не впорядкований. Враховуючи набір у вашому коді, ви не можете вважати, що він замовлений без порушення принципів SOLID.
сара

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

Якщо ви заявляєте LinkedHashSet, ви не маєте справу з набором, тому заявляти претензії щодо того, як повинні вести себе набори, навряд чи актуально. Я б сказав, що присвоєння (можливого) впорядкованості наборам на основі деяких реалізацій схоже на те, що "Екземпляри Runnable мають метод запуску, призначений для запуску на якійсь потоці. Також вони відкривають з'єднання БД і читають дані клієнтів залежно від реалізації. " Звичайно, деякі реалізації можуть це зробити, але це не те, що має на увазі інтерфейс Runnable.
сара

5

Це може бути не відповідь, яку ви шукаєте, але JavaDoc класів колекцій насправді досить описовий. Скопіювати / вставити:

Впорядкована колекція (також відома як послідовність). Користувач цього інтерфейсу має точний контроль над тим, куди в списку вставлений кожен елемент. Користувач може отримати доступ до елементів за допомогою їх цілого індексу (позиція в списку) та шукати елементи в списку.

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


5

Набір - це не упорядкована група відмінних об'єктів - не допускаються повторювані об’єкти. Він, як правило, реалізується за допомогою хеш-коду вставлених об'єктів. (Конкретні реалізації можуть додавати замовлення, але сам інтерфейс Set не робить.)

Список - це упорядкована група об'єктів, яка може містити дублікати. Він може бути реалізований за допомогою ArrayList, LinkedListі т.д.


1
Я розгублений 😕! Що означає впорядкований / не упорядкований в цьому контексті? Це пов'язано з порядком зростання та низхідним порядком? Якщо так, Listне наказується 😕
malhobayyeb

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

5

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

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
Значення: null
Значення: null

Встановити:
Встановити не дозволяється жодних повторюваних елементів, і це дозволить отримати одне нульове значення. Він не підтримуватиме жодного порядку для відображення елементів. Тільки 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
Набір не дозволяє нульове значення та дублювання значення


3

1.List дозволяє повторювати значення, а set не дозволяє дублікати

2.Список підтримує порядок, у який ви вставляли елементи до списку Set, не підтримує порядок. 3. Список є впорядкованою послідовністю елементів, тоді як Set - це чіткий перелік елементів, який не має упорядкованості.


3

Список Vs Set

1) Набір не дозволяє дублікати. Список дозволяє дублювати. На основі реалізації Set, він також підтримує порядок вставки.

наприклад: LinkedHashSet. Він підтримує установчі order.Please см натисніть тут

2) містить метод. За характером набору це забезпечить кращі показники доступу. У кращому випадку його o (1). Але у Списку є проблема з ефективністю, яку потрібно викликати contains.


2

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

Ці Setкласи не підтримують порядок введення. Вони необов'язково можуть накладати певний порядок (як і у випадку SortedSet), але зазвичай мають порядок, визначений реалізацією, заснований на деякій хеш-функції (як і у випадку HashSet). Оскільки Setдоступ до s здійснюється за допомогою ключа, копії заборонені.


Карти зберігають об’єкти за ключем, але встановлюють об’єкти зберігання, використовуючи унікальне значення, пов'язане з об'єктом, як правило, його хеш-код. (Карти можуть також використовувати хеш-коди, щоб перевірити наявність унікальності ключа, але їх не потрібно.)
Квінн Тейлор,

1

Замовлення ... у списку є замовлення, набір - ні.


2
Набір ADT не вказує впорядкування, але деякі реалізації Set (наприклад, LinkedHashSet) зберігають порядок вставки.
Майкл Майерс

3
Однак більш важлива відмінність полягає в тому, що набори не дозволяють дублювати. Сумка / мультисети робить.
Квінн Тейлор

TreeSet має замовлення.
stackoverflowuser2010

1

Кілька приміток, гідних відмінностей між Список і Набором на Java, наведені нижче:

1) Принципова різниця між списком та набором у Java - це можливість створення повторюваних елементів. Список у Java дозволяє дублікати, тоді як Set не дозволяє дублікати. Якщо ви вставите дублікат у Set, він замінить старе значення. Будь-яка реалізація Set в Java містить лише унікальні елементи.

2) Ще одна суттєва відмінність між List і Set в Java - це порядок. Список - це упорядкована колекція, тоді як Set - це не упорядкована колекція. Список підтримує порядок вставки елементів, тобто будь-який елемент, який вставляється раніше, буде переходити на нижчий показник, ніж будь-який елемент, який вставляється після. Набір у Java не підтримує жодного порядку. Хоча Set надає іншу альтернативу під назвою SortedSet, яка може зберігати набір елементів у певному порядку сортування, визначеному методами Порівняння та Порівняння об'єктів, що зберігаються у Наборі.

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

Привіт Стільки відповідей уже дано .. Дозвольте зазначити деякі моменти, які досі не згадуються:

  • Більшість реалізацій списку (ArrayList, Vector) реалізуютьсяRandomAccess інтерфейс, який є маркером інтерфейсу для швидшого доступу. Жодна з реалізацій Set не робить цього.
  • У списку використовується один спеціальний ітератор, який називається, ListIterator який підтримує ітерацію в обох напрямках . Набір використовує Ітератор, який підтримує лише 1 спосіб ітерації
  • HashSet займає в 5,5 рази більше пам'яті, ніж ArrayList, для зберігання однакової кількості елементів.

@smurti це трохи пізно, і я не впевнений, чи це ви помітили, але ваш перший пункт суперечить собі: "Більшість реалізацій списку (ArrayList, Vector) реалізують RandomAccess ..." і "... Жоден зі списку реалізації роблять це "
Пітер М

0

Найбільша різниця - це базове поняття.

З інтерфейсу Set and List . Набір - це концепція математики. Встановити метод розширює collection.however Не додає новий метод. size () означає кардинальність (більше - BitSet.cardinality, лінійний лічильник Log Журнал журналу , HyperLogLog ). addAll () означає об'єднання. retainAll () означає перехрестя. removeAll () означає різницю.

Однак список НЕ вистачає цих понять. Список додає багато методів для підтримки концепції послідовностей, які інтерфейс колекції не постачає. Основна концепція - INDEX . наприклад, додавати (індекс, елемент), отримати (індекс), пошук (indexOf ()), видалити (індекс) елемент. У списку також міститься підліст " Перегляд колекції " . Набір не мають перегляду. не мають позиційного доступу. У списку також представлено багато алгоритмів у класі Collections . сортувати (Список), binarySearch (Список), зворотний (Список), перетасувати (Список), залити (Список). Параметр методу - це інтерфейс List . дублюючі елементи - лише результат понять. не істотна різниця.

Отже, істотною відмінністю є концепція. Набір - це концепція набору математики. Список - це концепція послідовності.


-1

Ось чіткий приклад з бурхливим. я створюю набір і список. то я намагаюся зберігати 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]

Ви можете бачити, що різниця полягає в тому, що:

  • Набір не дозволяє повторювати значення.
  • Список дозволяє повторювати значення.

1
Списки також підтримують замовлення.
glen3b

-1

Як і відповідь, оскільки SET не має подвійного значення, а список може. Звичайно, замовлення - це ще одне, чим їх відрізняти.


-1

Набір: Набір не може мати копії елементів у своїх колекціях. це також не упорядкована колекція. Для доступу до даних із Set, потрібно використовувати лише Iterator, а отримання на основі індексу неможливо. В основному використовується, коли вимагається колекція унікальності.

Список: Список може мати повторювані елементи із впорядкованим природним чином. Таким чином, з нього можна отримати дані на основі індексу або ітератора. Він широко використовується для зберігання колекції, до якої потрібно отримати доступ на основі індексу.


-2

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

Я щойно пройшов найважливішу тему Java під назвою Collections Framework. Я думав поділитися з вами своїми маленькими знаннями про колекції. Список, Набір, Карта - найважливіша тема цієї теми. Тож почнемо зі списку та встановлення.

Різниця між списком та набором:

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

  2. Інтерфейс списку дозволяє повторювати значення (елементи), тоді як встановити інтерфейс не дозволяє повторювати значення. У разі дублювання елементів у Set, він замінює старі значення.

  3. Інтерфейс списку дозволяє отримати значення NULL там, де інтерфейс Set не дозволяє Null. У разі використання нульових значень у Set задає NullPointerException.

  4. Інтерфейс списку підтримує порядок вставки. Це означає, що ми додаємо елементи в Список таким же чином, як і отримуємо його за допомогою ітератора або для кожного стилю. Тоді як Setреалізації не обов'язково підтримують порядок вставки. (Хоча SortedSetвикористовує TreeSetта LinkedHashSetпідтримує порядок вставки).

  5. В інтерфейсі списку визначені власні методи, тоді як інтерфейс Set не має власного методу, тому Set використовує лише методи інтерфейсу колекції.

  6. Інтерфейс списку має один спадковий клас під назвою, Vectorтоді як інтерфейс Set не має спадкового класу

  7. І останнє, але не менш важливе ... listIterator()Метод можна використовувати лише для переходу елементів у класах List List, тоді як ми можемо використовувати метод iterator () для доступу до набору елементів класу

Що ще ми можемо додати? Будь ласка, дай мені знати.

Дякую.


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

-3

Набір:

Не може бути повторюваних значень Упорядкування залежить від реалізації. За замовчуванням це не впорядковано. Неможливо отримати доступ за індексом

Список:

Може мати повторювані значення, упорядковані за замовчуванням. Може мати доступ за індексом

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.