HashSet против LinkedHashSet

В чем разница между ними? Я знаю, что

LinkedHashSet - это упорядоченная версия HashSet, которая поддерживает двусвязный список по всем элементам. Используйте этот класс вместо HashSet когда вы заботитесь о порядке итерации. Когда вы выполняете итерацию через HashSet, порядок непредсказуем, а LinkedHashSet позволяет вам перебирать элементы в том порядке, в котором они были вставлены.

Но в исходном коде LinkedHashSet есть только вызывающие конструкторы HashSet. Итак, где двойной привязкой список и порядок вставки?

4b9b3361

Ответ заключается в , который конструкторы используют 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);
}
51
ответ дан 22 февр. '11 в 19:10
источник
Конструкторы

LinkedHashSet ссылаются на следующий конструктор базового класса:

HashSet(int initialCapacity, float loadFactor, boolean dummy) {
  map = new LinkedHashMap<E, Object>(initialCapacity, loadFactor);
}

Как вы можете видеть, внутренняя карта - это LinkedHashMap. Если вы заглянете внутрь LinkedHashMap, вы увидите следующее поле:

private transient Entry<K, V> header;

Это связанный список.

23
ответ дан 22 февр. '11 в 19:11
источник

Вы должны посмотреть на источник конструктора HashSet, который он вызывает... это специальный конструктор, который делает поддержку Map a LinkedHashMap вместо только HashMap.

9
ответ дан 22 февр. '11 в 19:09
источник

A HashSet является неупорядоченным и несортированным. LinkedHashSet - это упорядоченная версия HashSet. Единственная разница между HashSet и LinkedHashSet заключается в том, что LinkedHashSet поддерживает порядок вставки. Когда мы итерации через HashSet, порядок непредсказуем, тогда как он предсказуем в случае LinkedHashSet. Причина, по которой LinkedHashSet поддерживает порядок вставки, заключается в том, что базовая структура данных представляет собой двусвязный список.

5
ответ дан 01 июля '16 в 12:33
источник

Я предлагаю вам использовать LinkedHashSet большую часть времени, потому что он имеет лучшую производительность в целом):

  • Предсказуемый итерация LinkedHashSet (Oracle)
  • LinkedHashSet дороже для вложений, чем HashSet;
  • В целом немного лучше, чем HashMap, потому что большую часть времени мы используем Set structure для итерации.

Тесты производительности:

------------- 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

Здесь вы можете увидеть исходную тестовую страницу: Окончательный пример тестирования производительности

2
ответ дан 16 февр. '17 в 12:07
источник

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.

2
ответ дан 19 дек. '13 в 22:19
источник

Если вы посмотрите на конструкторы, вызванные из класса LinkedHashSet, вы увидите, что внутри это a LinkedHashMap, который используется для целей резервного копирования.

1
ответ дан 22 февр. '11 в 19:12
источник

Все методы и конструкторы одинаковы, но только одно отличие: LinkedHashset будет поддерживать порядок вставки, но он не позволит дублировать.

Hashset не будет поддерживать порядок вставки. Это комбинация List и Set simple:)

0
ответ дан 21 авг. '16 в 15:24
источник

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.
0
ответ дан 24 нояб. '17 в 19:47
источник