HashSet против LinkedHashSet
В чем разница между ними? Я знаю, что
LinkedHashSet - это упорядоченная версия HashSet, которая поддерживает двусвязный список по всем элементам. Используйте этот класс вместо HashSet когда вы заботитесь о порядке итерации. Когда вы выполняете итерацию через HashSet, порядок непредсказуем, а LinkedHashSet позволяет вам перебирать элементы в том порядке, в котором они были вставлены.
Но в исходном коде LinkedHashSet есть только вызывающие конструкторы HashSet. Итак, где двойной привязкой список и порядок вставки?
Ответы
Ответ 1
Ответ заключается в , который конструкторы используют LinkedHashSet
для построения базового класса:
public LinkedHashSet(int initialCapacity, float loadFactor) {
super(initialCapacity, loadFactor, true); // <-- boolean dummy argument
}
...
public LinkedHashSet(int initialCapacity) {
super(initialCapacity, .75f, true); // <-- boolean dummy argument
}
...
public LinkedHashSet() {
super(16, .75f, true); // <-- boolean dummy argument
}
...
public LinkedHashSet(Collection<? extends E> c) {
super(Math.max(2*c.size(), 11), .75f, true); // <-- boolean dummy argument
addAll(c);
}
И (один пример) конструктор HashSet
, который принимает логический аргумент, и выглядит следующим образом:
/**
* Constructs a new, empty linked hash set. (This package private
* constructor is only used by LinkedHashSet.) The backing
* HashMap instance is a LinkedHashMap with the specified initial
* capacity and the specified load factor.
*
* @param initialCapacity the initial capacity of the hash map
* @param loadFactor the load factor of the hash map
* @param dummy ignored (distinguishes this
* constructor from other int, float constructor.)
* @throws IllegalArgumentException if the initial capacity is less
* than zero, or if the load factor is nonpositive
*/
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
}
Ответ 2
Конструкторы LinkedHashSet
ссылаются на следующий конструктор базового класса:
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<E, Object>(initialCapacity, loadFactor);
}
Как вы можете видеть, внутренняя карта - это LinkedHashMap
. Если вы заглянете внутрь LinkedHashMap
, вы увидите следующее поле:
private transient Entry<K, V> header;
Это связанный список.
Ответ 3
HashSet неупорядоченный и несортированный набор.
LinkedHashSet является заказанной версией HashSet.
Единственная разница между HashSet и LinkedHashSet заключается в том, что:
LinkedHashSet поддерживает порядок вставки.
Когда мы выполняем итерацию HashSet, порядок непредсказуем, в то время как он предсказуем в случае LinkedHashSet.
Причина того, как LinkedHashSet поддерживает порядок вставки, заключается в том, что:
Основной используемой структурой данных является Doubly-Linked-List.
Ответ 4
Вы должны посмотреть на источник конструктора HashSet
, который он вызывает... это специальный конструктор, который делает поддержку Map
a LinkedHashMap
вместо только HashMap
.
Ответ 5
Я советую вам использовать LinkedHashSet
большую часть времени, поскольку в целом он имеет более высокую производительность):
- Предсказуемый итерационный порядок LinkedHashSet (Oracle)
- LinkedHashSet дороже для вставок, чем HashSet;
- В целом производительность немного выше, чем у
HashMap
, потому что большую часть времени мы используем структуры Set для итерации.
Performance tests:
------------- TreeSet -------------
size add contains iterate
10 746 173 89
100 501 264 68
1000 714 410 69
10000 1975 552 69
------------- HashSet -------------
size add contains iterate
10 308 91 94
100 178 75 73
1000 216 110 72
10000 711 215 100
---------- LinkedHashSet ----------
size add contains iterate
10 350 65 83
100 270 74 55
1000 303 111 54
10000 1615 256 58
Вы можете увидеть исходную тестовую страницу здесь: Финальный пример тестирования производительности
Ответ 6
HashSet:
Неупорядоченный на самом деле.
если u, проходящий через параметр, означает
Set<Integer> set=new HashSet<Integer>();
for(int i=0;i<set.length;i++)
{
SOP(set)`enter code here`
}
Out Put:
Может быть 2,1,3
не предсказуемым. следующий раз другой заказ.
LinkedHashSet()
, которые производят порядок FIFO.
Ответ 7
HashSet
не поддерживать порядок вставки элемента
LinkedHashSet
поддерживать порядок вставки элемента
Пример
Set<String> set = ...;// using new HashSet<>() OR new LinkedHashSet<>()
set.add("2");
set.add("1");
set.add("ab");
for(String value : set){
System.out.println(value);
}
HashSet
вывод
1
ab
2
LinkedHashSet
вывод
2
1
ab
Ответ 8
HashSet:
Подчеркнутая структура данных - Hashtable.
Дублированные объекты не разрешены. Порядок инсерции не сохраняется и основан на хеш-коде объектов.
Возможна нулевая вставка (только один раз).
Он реализует интерфейс Serializable, Clonable, но не RandomAccess.
HashSet лучше всего выбирать, если частая операция - операция поиска.
В HashSet дубликаты не разрешены. Если пользователи пытаются вставлять дубликаты, когда мы не будем получать какие-либо исключения для компиляции или выполнения. add метод возвращает просто false.
Конструкторы:
HashSet h = новый HashSet(); создает пустой объект HashSet с начальной начальной загрузкой по умолчанию 16, а коэффициент заполнения по умолчанию (коэффициент нагрузки) равен 0,75.
HashSet h = новый HashSet (int initialCapacity); создает пустой объект HashSet с указанным параметром initialCapacity, а значение по умолчанию - 0.75.
HashSet h = новый HashSet (int initialCapacity, float fillRatio);
HashSet h = новый HashSet (коллекция c); создает эквивалентный объект HashSet для данной коллекции. Этот конструктор предназначен для взаимного преобразования между объектом коллекции.
LinkedHashSet:
Это дочерний класс HashSet. он точно такой же, как HashSet, включая (конструкторы и методы), за исключением следующих отличий.
Различия
HashSet:
- Подчеркнутая структура данных - Hashtable.
- Порядок вставки не сохраняется.
- представил версию 1.2.
LinkedHashSet:
- Подчеркнутая структура данных представляет собой комбинацию LinkedList и Hashtable.
- Порядок вставки сохраняется.
- Введен в версию 1.4.
Ответ 9
Если вы посмотрите на конструкторы, вызванные из класса LinkedHashSet
, вы увидите, что внутри это a LinkedHashMap
, который используется для целей резервного копирования.
Ответ 10
Все методы и конструкторы одинаковы, но только одно отличие: LinkedHashset будет поддерживать порядок вставки, но он не позволит дублировать.
Hashset не будет поддерживать порядок вставки.
Это комбинация List и Set simple:)