Hashset,Treeset和Linkedhashset,Hashmap之间的主要区别是什么?它在Java中是如何工作的?

我只是理解LinkedHashSet在插入时不允许重复元素。 但是,我不明白Hashset在java中是如何工作的? 我知道有一点Hashtable在Hashset中使用,所以哈希表用于存储元素,这里也不允许重复元素。 然后,Treeset也类似于Hashset,它也不允许重复条目,因此将看到唯一的元素,并且它遵循升序。

我对HashMap还有一个疑问 – Hashmap没有维护顺序。 它可能有一个空键和多个空值。 我只是不明白这一点,实际上是什么意思? 这有什么实际的例子吗?

我知道了一点,Hashmap曾经基于此工作 – 用于放入存储桶的密钥和值也有唯一的数字。 这样,就可以从桶中识别并获取密钥和价值。 当我将键/值对放在桶中时,其标识符是键的哈希码。 对于例如:密钥的哈希码是101,因此它存储在桶101中。一个桶可以存储多于密钥和值对。 假设一个例子,因为Object1是“A”,object2是“A”而object3是“B”,那么它具有相同的哈希码。 因此,它通过在同一个桶中共享相同的Hashcode来存储不同的对象。 我的疑问是,具有相同Hashcode的对象应该相等,不同的对象应该有不同的Hashcode?

我是初学者,请澄清我的疑虑并为这种愚蠢的怀疑道歉!

这是使用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 

我的疑问是,为什么“a”插入“B”和“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中具有更好的性能?

我的疑问是,为什么“a”插入“B”和“C”之间。

TreeSet对条目进行排序。

LinkedHashSet保留插入顺序。

HashSet不保留插入顺序,并且不对条目进行排序/排序。 这意味着当你遍历集合时,条目将以难以理解的顺序返回……并且没有实际意义。 没有特别的“理由”在那一点插入"a" 。 这就是结果……给定输入键的集合以及它们的插入顺序。

我唯一的疑问是,Hashset如何在Java中运行。

它实现了一个哈希表。 有关概述,请阅读有关哈希表的Wikipedia页面,有关详细信息,请阅读java.util.HashMapjava.util.HashSet的源代码。

简短的回答是HashSetHashMap都是一个哈希表,实现为哈希链数组。

我知道,LinkedHashset遵循双重链接列表。 如果它使用双链表,那么它如何存储元素?

LinkedHashSet本质上是一个哈希表,带有一个记录插入顺序的附加链表。 元素存储在主哈希表中……这就是提供快速查找的原因。 再次,请参阅源代码以获取详细信息。

双链表是什么意思,它是如何工作的?

阅读维基百科上关于双链表的文章。


然后,所有这三个Hashset,Treeset,Linkedhashset将在Java中使用,哪个在Java中具有更好的性能?

在这三个类(和其他类)之间进行选择时,需要考虑很多事情:

  • 它们是否提供所需的function。 例如,我们已经看到它们在迭代次序方面有不同的行为。

  • 他们是否具有所需的并发属性? 例如,它们是线程安全的吗? 他们处理争用吗? 他们是否允许并发修改?

  • 他们需要多少空间?

  • 什么是性能(时间)特征。

在最后两点?

  • TreeSet使用最小空间, LinkedHashSet使用最多。

  • 对于较大的集合, HashSet往往是最快的查找,插入和删除,而TreeSet往往是最慢的。

我会简洁的。

集合遵循集合的数学理论。 Set(AbstractSet是Java中的超类型)类似于列表,除了它不能具有两次相同的元素。

HashSet使用HashMap实现它,TreeSet使用Tree实现它,LinkedHashset使用双向链表实现它。

首先,您需要知道所有Set实现共享相同的function:它们不允许重复。 它不仅仅是LinkedHashSet一个function。

其次,一个重要的区别是,在您询问的3种类型中, TreeSet是一个有序集合,即元素按照其自然顺序排序或根据使用Comparator或实现Comparable接口强制描述的逻辑排序。

切换到HashSetLinkedHashSet之间的区别,请注意LinkedHashSetHashSet的子类。 它们不是排序集。

HashSet是集合中最快的实现,它使用(首先) hashCode()方法返回的哈希值和(然后) equals()方法确保元素的唯一性。 在幕后,它使用HashMap

LinkedHashSetLinkedList的帮助下确保对集合元素的一致排序,而基本HashSet不提供。

  • HashSet不保留元素的顺序。所以你无法识别它的顺序。
  • LinkedHashSet在set中添加元素时保留顺序。 它在我们插入时保持顺序。

  • TreeSet维护元素的顺序。 TreeSet是最慢的,因为它在每个元素添加或删除后排列其元素。

    否则,无论您是否需要有序列表,线程安全等,它都会依赖您的要求。

HashMap接受键值对,它允许键和值的空值,而HashMap是非同步的。 HasTable接受键值对,它不允许键值和值的空值,并且HasTable是同步的。

了解更多信息