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

Я просто понимаю, что LinkedHashSet не позволяет дублировать элементы при вставке. Но я не понимаю, как работает Hashset в Java? Я немного знаю, что 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?

5 ответов

Решение

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

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 имеет тенденцию быть самым медленным.

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

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

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

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

LinkedHashSet обеспечивает последовательное упорядочение элементов набора с помощью LinkedListкакой основной HashSets не предоставляют.

Я буду кратким.

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

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

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

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

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

HashMap принимает пару ключ-значение, он допускает нулевое значение как для ключа, так и для значения, а HashMap является несинхронизированным. HasTable принимает пару ключ-значение, он не допускает нулевое значение для ключа и значения, а HasTable синхронизируется.

для получения дополнительной информации

Другие вопросы по тегам