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.HashMap
和java.util.HashSet
的源代码。
简短的回答是HashSet
和HashMap
都是一个哈希表,实现为哈希链数组。
我知道,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
接口强制描述的逻辑排序。
切换到HashSet
和LinkedHashSet
之间的区别,请注意LinkedHashSet
是HashSet
的子类。 它们不是排序集。
HashSet
是集合中最快的实现,它使用(首先) hashCode()
方法返回的哈希值和(然后) equals()
方法确保元素的唯一性。 在幕后,它使用HashMap
。
LinkedHashSet
在LinkedList
的帮助下确保对集合元素的一致排序,而基本HashSet
不提供。
- HashSet不保留元素的顺序。所以你无法识别它的顺序。
-
LinkedHashSet在set中添加元素时保留顺序。 它在我们插入时保持顺序。
-
TreeSet维护元素的顺序。 TreeSet是最慢的,因为它在每个元素添加或删除后排列其元素。
否则,无论您是否需要有序列表,线程安全等,它都会依赖您的要求。
HashMap接受键值对,它允许键和值的空值,而HashMap是非同步的。 HasTable接受键值对,它不允许键值和值的空值,并且HasTable是同步的。
了解更多信息