В чем основное различие между 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
какой основной HashSet
s не предоставляют.
Я буду кратким.
Набор следует математической теории множеств. Набор (AbstractSet является супертипом в Java) похож на список, за исключением того, что он не может иметь один и тот же элемент дважды.
HashSet реализует его с помощью HashMap, TreeSet реализует его с помощью дерева, LinkedHashset реализует его с помощью двусвязного списка.
- HashSet не сохраняет порядок элементов. Так что вы не можете определить его порядок.
LinkedHashSet сохраняет порядок, так как элементы добавляются в набор. Это сохранить порядок, как мы вставляем в него.
TreeSet поддерживает порядок элементов. TreeSet работает медленнее, потому что он размещает свои элементы после каждого добавления или удаления элемента.
В противном случае все это зависит от вашего требования, нужен ли вам упорядоченный список, потокобезопасен и т. Д.
HashMap принимает пару ключ-значение, он допускает нулевое значение как для ключа, так и для значения, а HashMap является несинхронизированным. HasTable принимает пару ключ-значение, он не допускает нулевое значение для ключа и значения, а HasTable синхронизируется.
для получения дополнительной информации