Вопрос по java, set, list – В чем разница между Set и List?

364

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

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

Ваш Ответ

22   ответа
201
╔═══════════════════╦══════════════════════╦═════════════════════════════╗
║                   ║         List         ║            Set              ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║     Duplicates    ║          YES         ║            NO               ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║       Order       ║       ORDERED        ║  DEPENDS ON IMPLEMENTATION  ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Positional Access ║         YES          ║            NO               ║ 
╚═══════════════════╩══════════════════════╩═════════════════════════════╝
Как Индексируются Наборы, если не позиционным доступом? (+1 для ASCII-таблицы)
Стоит отметить: производительность позиционного доступа во многом зависит от базовой реализации, массива и связанного списка.stackoverflow.com/questions/322715/…
26

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

3

1. не допускает ли дублирование

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

0

моменты, которые пока не упомянуты:

Most of the List implementations (ArrayList,Vector) implement RandomAccess interface which is a marker interface for faster access. None of the Set implementations do that. List uses one special Iterator called ListIterator which supports iteration in both directions. Set uses Iterator which supports only 1 way iteration HashSet takes 5.5 times more memory than ArrayList for storing same number of elements.
@smurti, это немного поздно, и я не уверен, что вы заметили, но ваш первый пункт противоречит самому себе: «Большинство реализаций List (ArrayList, Vector) реализуют RandomAccess ... & quot; и & quot; ... ни одна из реализаций List не делает этого & quot;
@Peter M исправлен ... спасибо за указание
5

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

An ordered collection (also known as a sequence). The user of this interface has precise control over where in the list each element is inserted. The user can access elements by their integer index (position in the list), and search for elements in the list.

Unlike sets, lists typically allow duplicate elements. More formally, lists typically allow pairs of elements e1 and e2 such that e1.equals(e2), and they typically allow multiple null elements if they allow null elements at all. It is not inconceivable that someone might wish to implement a list that prohibits duplicates, by throwing runtime exceptions when the user attempts to insert them, but we expect this usage to be rare.

464

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

List<E>:

An ordered collection (also known as a sequence). The user of this interface has precise control over where in the list each element is inserted. The user can access elements by their integer index (position in the list), and search for elements in the list.

Set<E>:

A collection that contains no duplicate elements. More formally, sets contain no pair of elements e1 and e2 such that e1.equals(e2), and at most one null element. As implied by its name, this interface models the mathematical set abstraction.

Для SortedSet не существует двух элементов, где compareTo () == 0, так как equals не вызывается.
Набор МОЖЕТ быть заказан, поэтому первое утверждение этого ответа вводит в заблуждение, даже если, конечно, список должен быть выбран для обеспечения порядка сбора
Не объединяйте "заказанный" с "отсортировано". Аналогично, не объединяйте контракт интерфейса и реализации интерфейса. Также неправильно говорить, что что-то «неупорядоченное» не имеет порядка, это просто означает, что нет никаких гарантий относительно выполнения заказа (и что порядок может быть нестабильным между вызовами, в отличие от упорядоченного списка).
НЕПРАВИЛЬНО! Набор Java можно заказать в зависимости от реализации; например, упорядочен Java TreeSet. В контексте Java единственное различие между списком и набором состоит в том, что набор содержит уникальные элементы. В контексте математики элементы набора уникальны и неупорядочены.
Да, набор Java МОЖЕТ быть НО НЕ ОБЯЗАТЕЛЬНО заказан. Да, если у вас есть TreeSet, вы можете рассчитывать на этот заказ. Но вы должны ЗНАТЬ, что у вас есть TreeSet, а не просто Set. Если вам возвращают Набор, вы не можете зависеть от того, что будет заказано. Список, с другой стороны, упорядочен по самой своей природе, и любая реализация List должна быть упорядочена. Таким образом, с точки зрения определения интерфейса, не является особенно неправильным говорить, что набор неупорядочен, но, возможно, немного более технически правильно сказать, что набор не дает гарантии порядка элементов.
0

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

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

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

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

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

2

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

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

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

List Vs Set

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

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

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

Почему вы повторяете уже полученный ответ?
3

List:
используя соответствующий индекс элементов, а также он будет отображать элементы в порядке вставки. Пример: (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);
    }
 }

}

Output:

1
1
555
333
888
555
ноль
ноль
Значение: 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");
    }

 }

}

Output:

все
Привет
добро пожаловать
Мир
java.lang.NullPointerException
Set doesn't allow null value and duplicate value

Почему вы повторяете уже полученный ответ?
-1

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

Почему вы повторяете уже полученный ответ?
5

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

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

Я сбит с толку ! Что означает упорядоченный / неупорядоченный в этом контексте? Это связано с возрастающим и убывающим порядком? Если так,List не заказан
Ordered когда входные данные расположены точно так, как они были введены пользователем, тогда какSorted это когда входные данные сортируются лексикографически или в порядке возрастания / убывания (в терминах целочисленных значений).Unordered означает, что входные данные могут храниться или не сохраняться в порядке ввода пользователем.
-2

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

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

List is a collection class which extends AbstractList class where as Set is a collection class which extends AbstractSet class but both implements Collection interface.

List interface allows duplicate values (elements) whereas Set interface does not allow duplicate values. In case of duplicate elements in Set, it replaces older values.

List interface all,ows NULL values where as Set interface does not allow Null values. In case of using Null values in Set it gives NullPointerException.

List interface maintains insertion order. That means the way we add the elements in the List in the same way we obtain it using iterator or for-each style. Whereas Set implementations do not necessarily maintain insertion order. (Although SortedSet does using TreeSet, and LinkedHashSet maintains insertion order).

List interface has its own methods defined whereas Set interface does not have its own method so Set uses Collection interface methods only.

List interface has one legacy class called Vector whereas Set interface does not have any legacy class

Last but not the least... The listIterator() method can only be used to cycle through the elements within List Classes whereas we can use iterator() method to access Set class elements

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

Благодарю.

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

ListLists должны быть упорядочены и поэтому доступны по индексу.

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

Set:

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

Implementation classes include: HashSet (unordered), LinkedHashSet (ordered), TreeSet (заказано естественным заказом или предоставленным компаратором)

10

List

Is an Ordered grouping of elements. List is used to collection of elements with duplicates.

Set

Is an Unordered grouping of elements. Set is used to collection of elements without duplicates. No new methods are defined inside Set interface, so we have to use Collection interface methods only with Set subclasses.
7

почему бы не взглянуть на Javadoc ?!

A List is an ordered collection (sequence), which typically allows duplicates A Set a is collection that contains no duplicate elements, iteration order may be guaranteed by the implementation

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

Это интерфейс, ВСЕ зависит от реализации. List.get () может создать файл, содержащий первые 5 десятичных дробей числа pi, и выдать исключение StackOverFlowException в некоторых реализациях, это не означает, что вы можете сказать «список - это то, что может создавать файлы», поскольку он не является частью контракт определяется интерфейсом. Набор претензий docs смоделирован по математической концепции набора, который по определению не упорядочен. Учитывая набор в вашем коде, вы не можете предполагать, что он упорядочен без нарушения принципов SOLID.
@ Кай, я обычно держуLinkedHashSet с левой стороны, если код опирается на порядок позже. Я использую толькоSet если я действительно использую его как один, так как вы не можете предположить, что базовая реализация являетсяLinkedHashSet или так, это может быть сегодня, но завтра код изменится, и он потерпит неудачу.
Если вы объявляете LinkedHashSet, вы не имеете дело с множеством, поэтому вряд ли уместно делать заявления о том, как наборы должны вести себя. Я бы сказал, что приписывание (возможной) упорядоченности множествам на основе некоторых реализаций сродни утверждению «Экземпляры Runnable имеют метод run, предназначенный для запуска в некотором потоке. Также они открывают соединение с БД и читают данные клиентов в зависимости от реализации. & Quot; Конечно, некоторые реализации могут сделать это, но это не то, что подразумевается под Runnable Interface.
Правильный. LinkedHashSet содержит элементы в порядке вставки.
16
A List is an ordered grouping of items A Set is an unordered grouping of items with no duplicates allowed (usually)

которая допускает дублирование как Мешок, а не разрешает дублирование как Набор.

Набор не может иметь дубликатов.
Некоторые реализации набора упорядочены (например, LinkedHashSet, который поддерживает LinkedList за кулисами). Но Set ADT не имеет порядка.
-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]

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

Set does not allow duplicate values. List allow duplicate values.
Списки также поддерживают порядок.
Почему вы повторяете уже полученный ответ?
69

Упорядоченные списки элементов (уникальные или нет)
Conform to Java's interface named List
Доступ к индексу

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

LinkedList ArrayList

Списки уникальных элементов:
Conform to Java's interface named Set
Можноnot быть доступным по индексу

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

HashSet (unordered) LinkedHashSet (ordered) TreeSet (sorted by natural order or by provided comparator)

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

1

1) Принципиальное различие между List и Set в 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

Allowed duplicates. Ordered in grouping elements.(In other words having definite order.No need to sorted in ascending order)

Задавать:

Not allowed duplicates. Unordered in grouping elements.(In other words having no definite order.It might or might not arranged in ascending order )
Почему вы повторяете уже полученный ответ?

Похожие вопросы