В чем принципиальное различие между Set<E>
и List<E>
интерфейсами?
В чем принципиальное различие между Set<E>
и List<E>
интерфейсами?
Ответы:
List
является упорядоченной последовательностью элементов, тогда Set
как это отдельный список элементов, который неупорядочен (спасибо, Куинн Тейлор ).
Упорядоченная коллекция (также известная как последовательность). Пользователь этого интерфейса имеет точный контроль над тем, где в списке каждый элемент вставлен. Пользователь может получить доступ к элементам по их целочисленному индексу (позиции в списке) и искать элементы в списке.
Коллекция, которая не содержит повторяющихся элементов. Более формально, множества не содержат пары элементов e1 и e2, таких что e1.equals (e2), и не более одного нулевого элемента. Как следует из его названия, этот интерфейс моделирует абстракцию математического набора.
╔═══════════════════╦══════════════════════╦═════════════════════════════╗
║ ║ List ║ Set ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Duplicates ║ YES ║ NO ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Order ║ ORDERED ║ DEPENDS ON IMPLEMENTATION ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Positional Access ║ YES ║ NO ║
╚═══════════════════╩══════════════════════╩═════════════════════════════╝
Упорядоченные списки элементов (уникальные или нет)
Соответствуют интерфейсу Java с именемList
Доступ к индексу
реализовано с использованием
Списки уникальных элементов:
соответствуют интерфейсу Java с именемSet
Can not обращаться по индексу
реализовано с использованием
Оба интерфейса Set
и List
соответствуют интерфейсу Java с именемCollection
Концептуально мы обычно ссылаемся на неупорядоченную группировку, которая допускает дублирование как Мешок и не допускает дублирование как Набор.
Список
Набор
List
Как правило, допускается дублирование объектов.
List
s должны быть упорядочены и поэтому доступны по индексу.
Классы реализации включают в себя: ArrayList
, LinkedList
,Vector
Set
s не позволяют дублировать объекты. Большинство реализаций неупорядочены, но это зависит от реализации.
Классы реализации включают в себя:
HashSet
(неупорядоченный),
LinkedHashSet
(упорядоченный),
TreeSet
(упорядоченный по естественному заказу или предоставленному компаратору)
Поскольку мы говорим об интерфейсах Java, почему бы не взглянуть на Javadoc ?!
List
- упорядоченная коллекция (последовательность), которая обычно допускает дублированиеSet
- это коллекция, которая не содержит повторяющихся элементов, порядок итераций может быть гарантирован реализациейНет никакого упоминания об отсутствии порядка относительно множеств: это зависит от реализации.
LinkedHashSet
левой стороны, если код опирается на порядок позже. Я использую его только в том Set
случае, если я действительно использую его как единое целое, поскольку вы не можете предположить, что базовая реализация является LinkedHashSet
или такой, это может произойти сегодня, но завтра код изменится и произойдет сбой.
Возможно, это не тот ответ, который вы ищете, но JavaDoc классов коллекций на самом деле довольно нагляден. Копировать / вставить:
Упорядоченная коллекция (также известная как последовательность). Пользователь этого интерфейса имеет точный контроль над тем, где в списке каждый элемент вставлен. Пользователь может получить доступ к элементам по их целочисленному индексу (позиции в списке) и искать элементы в списке.
В отличие от наборов, списки обычно допускают дублирование элементов. Более формально списки обычно допускают пары элементов e1 и e2, например, e1.equals (e2), и они обычно допускают множественные нулевые элементы, если они вообще допускают нулевые элементы. Не исключено, что кто-то захочет реализовать список, который запрещает дублирование, создавая исключения времени выполнения, когда пользователь пытается вставить их, но мы ожидаем, что такое использование будет редким.
Набор - это неупорядоченная группа отдельных объектов - дублирующиеся объекты не допускаются. Обычно он реализуется с использованием хеш-кода вставляемых объектов. (Конкретные реализации могут добавлять порядок, но сам интерфейс Set - нет.)
Список - это упорядоченная группа объектов, которые могут содержать дубликаты. Это может быть реализовано с помощью ArrayList
, LinkedList
и т.д.
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);
}
}
}
Вывод:
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 не позволяет нулевое значение и повторяющееся значение
1.List позволяет дублировать значения и установить не разрешать дубликаты
2.List поддерживает порядок, в котором вы вставили элементы в список Set, не поддерживает порядок. 3.List - упорядоченная последовательность элементов, тогда как Set - это отдельный список элементов, который неупорядочен.
Список против множества
1) Набор не допускает дублирования. Список позволяет дублировать. Основываясь на реализации Set, он также поддерживает порядок вставки.
например: LinkedHashSet
. Это поддерживает порядок вставки. Пожалуйста, обратитесь нажмите здесь
2) содержит метод. По своей природе набор даст лучшую производительность для доступа. В лучшем случае это o (1). Но у List есть проблема с производительностью для вызова contains
.
Все List
классы поддерживают порядок вставки. Они используют разные реализации, основанные на производительности и других характеристиках (например, ArrayList
для скорости доступа к определенному индексу, LinkedList
для простого поддержания порядка). Поскольку ключа нет, дубликаты разрешены.
Эти Set
классы не поддерживают порядок ввода. Они могут опционально навязывать определенный порядок (как с SortedSet
), но обычно имеют определенный порядок реализации, основанный на некоторой хэш-функции (как с HashSet
). Так 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 - это путь.
Список:
Набор:
Set<E>
и List<E>
оба используются для хранения элементов типа E
. Разница в том, что они Set
хранятся в неупорядоченном виде и не допускают дублирования значений. List
используется для хранения элементов упорядоченным образом и допускает дублирование значений.
Set
элементы не могут быть доступны с позиции индекса, а List
элементы могут быть доступны с позиции индекса.
Привет. Так много ответов уже дано. Позвольте мне указать на некоторые моменты, которые пока не упомянуты:
RandomAccess
интерфейс, который является интерфейсом маркера для более быстрого доступа. Ни одна из реализаций Set не делает этого.ListIterator
который называется итерация в обоих направлениях . Set использует Iterator, который поддерживает только одностороннюю итерациюСамое большое отличие - это основная концепция.
Из интерфейса Set и List . Набор это математическая концепция. Метод set расширяет коллекцию. Однако мы не можем добавлять новый метод. size () означает кардинальность (больше - BitSet.cardinality, линейный счетчик , Log Log Log HyperLogLog ). addAll () означает объединение. retainAll () означает пересечение. removeAll () означает разницу.
Однако список не хватает этих понятий. Список добавляет много методов для поддержки концепции последовательности, которую интерфейс Collection не предоставляет. Основная концепция - ИНДЕКС . как добавить (индекс, элемент), получить (индекс), поиск (indexOf ()), удалить (индекс) элемент. Список также предоставляет подсписок « Представление коллекции » . Набор не имеет вид. не имеют позиционного доступа. Список также предоставляет множество алгоритмов в классе Коллекции . сортировки (List), BinarySearch (Список), обратный (список), перемешайте (List), заливку (List). Параметр метода является интерфейсом List . повторяющиеся элементы являются просто результатом концепций. не существенная разница.
Таким образом, существенная разница заключается в концепции. Набор - это математический набор. Список - это концепция последовательности.
Вот наглядный пример с 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, требуется использовать только итератор, и получение на основе индекса для него невозможно. Он в основном используется всякий раз, когда требуется сбор уникальности.
Список: Список может иметь повторяющиеся элементы с упорядоченным натуральным порядком при вставке. Таким образом, могут быть получены данные на основе индекса или итератора. Он широко используется для хранения коллекции, доступ к которой требуется на основе индекса.
Название темы: Список VS Set
Я только что прошел самую важную тему Java под названием Collections Framework. Я думал поделиться своими маленькими знаниями о коллекциях с вами. Список, Набор, Карта - самая важная тема этого. Итак, начнем с List и Set.
Разница между списком и множеством:
List - это класс коллекции, который расширяет AbstractList
класс, где Set - это класс коллекции, который расширяет AbstractSet
класс, но оба реализуют интерфейс Collection.
Интерфейс списка допускает дублирование значений (элементов), тогда как интерфейс Set не допускает дублирования значений. В случае дублирования элементов в Set он заменяет более старые значения.
Интерфейс списка допускает значения NULL, в то время как интерфейс Set не допускает значения NULL. В случае использования нулевых значений в Set это дает NullPointerException
.
Интерфейс списка поддерживает порядок вставки. Это означает, как мы добавляем элементы в список таким же образом, как мы получаем его, используя итератор или для каждого стиля. Принимая во внимание, что Set
реализации не обязательно поддерживают порядок вставки. (Хотя SortedSet
использует TreeSet
, и LinkedHashSet
поддерживает порядок вставки).
Интерфейс List имеет свои собственные определенные методы, тогда как интерфейс Set не имеет своего собственного метода, поэтому Set использует только методы интерфейса Collection.
Интерфейс List имеет один унаследованный класс, Vector
тогда как интерфейс Set не имеет унаследованного класса.
И последнее, но не менее важное ... listIterator()
Метод можно использовать только для циклического перемещения по элементам в List Classes, тогда как мы можем использовать метод iterator () для доступа к элементам Set класса.
Что-нибудь еще мы можем добавить? Пожалуйста, дайте мне знать.
Спасибо.
List
и Set
интерфейсы , которые также имеют «базовые» внедрения в виде абстрактного класса (которые вы упомянули). Кроме того, # 3 является полностью неточным , так как большинство наборов допускает нулевые значения (но зависит от реализации). Я не понимаю № 5 и № 7, и № 6 Vector
не является устаревшим, а просто синхронизирован и не предпочтителен для использования, кроме случаев, когда необходима синхронизация.
Набор:
Не может иметь повторяющихся значений. Порядок зависит от реализации. По умолчанию он не упорядочен. Не может иметь доступ по индексу.
Список:
Может иметь повторяющиеся значения. Упорядочено по умолчанию. Может иметь доступ по индексу.