В чем основное различие между Hashset, Treeset и LinkedHashset, Hashmap и как это работает в Java?

Я просто понимаю, что LinkedHashSet не позволяет дублировать элементы при вставке. Но я не понимаю, как Hashset работает в Hava? Я немного знаю, что Hashtable используется в Hashset, поэтому хеш-таблица, используемая для хранения элементов, также не позволяет дублировать элементы. Кроме того, Treeset также похож на Hashset, он также не позволяет дублировать записи, поэтому будут видны уникальные элементы в порядке возрастания.

У меня есть еще одно сомнение по поводу HashMap - Hashmap не поддерживает порядок. Он может иметь один нулевой ключ и несколько нулевых значений. Я просто не понимаю этого и что это на самом деле означает? Есть какой-нибудь практический пример для этого?

Я немного знаю, Hashmap раньше работал на основе этого - ключ и значения, используемые для помещения в ведра, также имеют уникальные номера. Таким образом, можно идентифицировать и получать ключ и значение из корзин. Когда я помещаю пару ключ / значение в корзину, идентификатор которой является хеш-кодом ключа.

Например: хэш-код ключа - 101, поэтому он хранится в сегменте 101. В одном сегменте может храниться больше, чем пары ключей и значений. Предположим, возьмем пример, поскольку Object1 - это «A», object2 - это «A», а object3 - «B», тогда у него такой же хеш-код. Таким образом, он хранит разные объекты, используя один и тот же хэш-код в одной корзине. Я сомневаюсь, что объекты с одинаковым хэш-кодом должны быть равны, а разные объекты должны иметь разные хэш-коды?

Это программа, использующая HashSet:

    import java.util.*;
    public class Simple{
    public static void main(String[] args){
    HashSet hh=new HashSet();
    hh.add("D");
    hh.add("A");
    hh.add("B");
    hh.add("C");
    hh.add("a");        
    System.out.println("Checking the size is:"+hh.size()+"");
    System.out.println(hh);

    Iterator i=hh.iterator();
    while(i.hasNext()){
    System.out.println(i.next());
    }      
    }
    }

Выход есть,

Checking the size is:5
[D, A, B, a, C]
D
A
B
a
C

Я сомневаюсь, почему «а» вставляется между «В» и «С».

Теперь я использую LinkedHashSet, поэтому

public class Simple{
public static void main(String[] args){
    LinkedHashSet hh=new LinkedHashSet();
            hh.add("D");
            hh.add("A");
    hh.add("B");
    hh.add("C");
            hh.add("a");  

        System.out.println("Checking the size is:"+hh.size()+"");
    System.out.println(hh);

    Iterator i=hh.iterator();
    while(i.hasNext()){
        System.out.println(i.next());
    }      
}
}

Я просто понимаю, что он следует порядку вставки и избегает повторяющихся элементов. Итак, на выходе

Checking the size is:5
[D, A, B, C, a]
D
A
B
C
a

Теперь, используя Treeset:

import java.util.*;
public class Simple{
public static void main(String[] args){
    TreeSet hh=new TreeSet();
            hh.add("1");
            hh.add("5");
            hh.add("3");
            hh.add("5");
            hh.add("2");
            hh.add("7");  

System.out.println("Checking the size is:"+hh.size()+"");
System.out.println(hh);

    Iterator i=hh.iterator();
    while(i.hasNext()){
        System.out.println(i.next());
    }      
}
}

Я просто понимаю, что Treeset следует по возрастанию.

The output is,
Checking the size is:5
[1, 2, 3, 5, 7]
1
2
3
5
7

Тогда я сомневаюсь, как Hashset работает на Java? И я знаю, что LinkedHashset следует двусвязному списку. Если он использует двусвязный список, то как он хранит элементы? Что означает двусвязный список и как он работает? Тогда где все эти три Hashset, Treeset, LinkedHashset будут использоваться в Java и какой из них имеет лучшую производительность в Java?


person Achiever    schedule 26.11.2013    source источник
comment
такая огромная тема, чтобы дать вам ответ здесь, лучше сначала изучите внимательно   -  person shreyansh jogi    schedule 26.11.2013
comment
Почему вы спрашиваете здесь, когда официальная документация отвечает на все ваши вопросы?   -  person Adam Arold    schedule 26.11.2013
comment
Проголосовали против, потому что вы сначала не погуглили.   -  person lscoughlin    schedule 26.11.2013
comment
Возможно, это не дубликат, поскольку вы спрашиваете о наборах, но это похоже: stackoverflow.com/questions/2889777/   -  person Pshemo    schedule 26.11.2013


Ответы (4)


Я сомневаюсь, почему «а» вставляется между «В» и «С».

TreeSet упорядочивает записи.

LinkedHashSet сохраняет порядок вставки.

HashSet не сохраняет порядок вставки и не сортирует / не упорядочивает записи. Это означает, что при итерации по набору записи возвращаются в порядке, который трудно понять ... и не имеет практического значения. Нет особой «причины», по которой "a" вставляется в этот момент. Так оно и вышло ... учитывая набор клавиш ввода и порядок, в котором они были вставлены.

Я сомневаюсь только в том, как Hashset работает на Java.

Реализована хеш-таблица. Прочтите страницу Википедии о хэш-таблицах для общего обзора, а также исходный код java.util.HashMap и java.util.HashSet для детали.

Короткий ответ заключается в том, что HashSet и HashMap представляют собой хеш-таблицу, реализованную как массив цепочек хеш-значений.

И я знаю, что LinkedHashset следует двусвязному списку. Если он использует двусвязный список, то как он хранит элементы?

LinkedHashSet - это, по сути, хеш-таблица с дополнительным связанным списком, в котором записан порядок вставки. Элементы хранятся в основной хеш-таблице ... и это обеспечивает быстрый поиск. Опять же, за подробностями обратитесь к исходному коду.

Что означает двусвязный список и как он работает?

Прочтите статью в Википедии о двусвязных списках.


Тогда где все эти три Hashset, Treeset, Linkedhashset будут использоваться в Java и какой из них имеет лучшую производительность в java?

При выборе между этими тремя классами (и другими) следует учитывать ряд вещей:

  • Предоставляют ли они необходимый функционал. Например, мы уже видели, что у них разное поведение в отношении порядка итерации.

  • Есть ли у них требуемые свойства параллелизма? Например, являются ли они потокобезопасными? они имеют дело с раздорами? они допускают одновременную модификацию?

  • Сколько места им требуется?

  • Какие бывают эксплуатационные (временные) характеристики.

По последним двум пунктам?

  • TreeSet использует меньше всего места, а LinkedHashSet - больше всего.

  • HashSet имеет тенденцию быть самым быстрым для поиска, вставки и удаления для больших наборов, а TreeSet имеет тенденцию быть самым медленным.

person Stephen C    schedule 26.11.2013

Я буду лаконичен.

Set следует математической теории множеств. Набор (AbstractSet - это супертип в Java) похож на список, за исключением того, что он не может иметь один и тот же элемент дважды.

HashSet реализует его с помощью HashMap, TreeSet реализует его с помощью Tree, LinkedHashset реализует его с помощью двусвязного списка.

person Pierre Arlaud    schedule 26.11.2013
comment
Фактически LinkedHashSet использует LinkedHashMap, который расширяет HashMap. По сути, это декоратор для HashMap. - person Adam Arold; 26.11.2013
comment
Интересно, спасибо. Дело в том, что вам не нужно особо заботиться о том, что за этим стоит, если они не допускают дубликатов :) - person Pierre Arlaud; 26.11.2013

Прежде всего, вам нужно знать, что все Set реализации имеют одну и ту же функцию: они не допускают дублирования. Это не просто особенность LinkedHashSet.

Во-вторых, одно важное отличие состоит в том, что из 3 типов наборов, о которых вы спрашивали, TreeSet является отсортированным набором, то есть элементы упорядочены в соответствии с их естественным порядком или в соответствии с логикой, императивно описанной с использованием Comparator или реализацией интерфейса Comparable. .

Переходя к разнице между HashSet и LinkedHashSet, обратите внимание, что LinkedHashSet является подклассом HashSet. Это не отсортированные наборы.

HashSet - это самая быстрая реализация набора, которая обеспечивает уникальность элементов, используя (сначала) их хеш-значение, возвращаемое методом hashCode(), а затем (затем) их метод equals(). За кулисами используется HashMap.

LinkedHashSet обеспечивает согласованное упорядочение элементов набора с помощью LinkedList, чего не обеспечивают базовые HashSet.

person Andrei Nicusan    schedule 26.11.2013

  • HashSet не сохраняет порядок элементов, поэтому вы не можете определить его порядок.
  • LinkedHashSet сохраняет порядок при добавлении элементов в набор. Он сохраняет тот порядок, в котором мы его вставляем.

  • TreeSet поддерживает порядок элементов. TreeSet является самым медленным, потому что он упорядочивает свои элементы после каждого добавления или удаления элемента.

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

person Reetika    schedule 10.08.2015