我只是理解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中具有更好的性能?
答案 0 :(得分:3)
我的疑问是,为什么“a”插入“B”和“C”之间。
TreeSet对条目进行排序。
LinkedHashSet保留了插入顺序。
HashSet不保留插入顺序,并且不对条目进行排序/排序。这意味着当你遍历集合时,条目将以难以理解的顺序返回......并且没有实际意义。没有特别的“原因”,"a"
在那一点被插入。这就是结果......给出了输入键的集合以及它们的插入顺序。
我唯一怀疑的是,Hashset如何在Java中运作。
它实现了一个哈希表。阅读hash tables上的维基百科页面以获取一般概述,并阅读java.util.HashMap
和java.util.HashSet
的源代码以获取详细信息。
简短的回答是HashSet
和HashMap
都是作为哈希链数组实现的哈希表。
我知道,LinkedHashset遵循双重链接列表。如果它使用双向链表,那么它如何存储元素?
LinkedHashSet
本质上是一个哈希表,带有一个记录插入顺序的附加链表。元素存储在主哈希表中......这就是提供快速查找的原因。再次,请参阅源代码以获取详细信息。
双链表是什么意思,它是如何工作的?
在doubly linked lists上阅读维基百科上的文章。
然后在Java中使用所有这三个Hashset,Treeset,Linkedhashset以及哪个在Java中具有更好的性能?
在这三个类(和其他类)之间进行选择时,需要考虑很多事情:
他们是否提供所需的功能。例如,我们已经看到他们在迭代次序方面有不同的行为。
他们是否具有所需的并发属性?例如,它们是线程安全的吗?他们处理争用吗?他们是否允许同时修改?
他们需要多少空间?
表现(时间)特征是什么。
最后两点?
TreeSet
占用的空间最小,而LinkedHashSet
使用的空间最少。
对于较大的集合,HashSet
往往是查找,插入和删除最快的,而TreeSet
往往是最慢的。
答案 1 :(得分:1)
我会简洁。
集合遵循集合的数学理论。 Set(AbstractSet是Java中的超类型)类似于列表,除了它不能有两次相同的元素。
HashSet使用HashMap实现它, TreeSet用Tree实现它, LinkedHashset使用双向链表实现它。
答案 2 :(得分:1)
首先,您需要知道所有Set
实现共享相同的功能:它们不允许重复。它不仅仅是LinkedHashSet
的一个功能。
第二,一个重要的区别是,在您询问的3种类型中,TreeSet
是一个有序集合,即元素按照其自然顺序排序或根据必须使用的逻辑进行排序Comparator
或实施Comparable
界面。
切换到HashSet
和LinkedHashSet
之间的差异,请注意LinkedHashSet
是HashSet
的子类。它们不是排序集。
HashSet
是集合中最快的实现,它使用hashCode()
方法和(然后)equals()
方法返回的哈希值(首先)确保元素的唯一性。在幕后,它使用HashMap
。
LinkedHashSet
在LinkedList
的帮助下确保对集合元素的一致排序,基本HashSet
不提供。
答案 3 :(得分:0)
LinkedHashSet在set中添加元素时保留顺序。它 在我们插入订单时保持订单。
TreeSet维护元素的顺序。 TreeSet是最慢的 因为它在每个元素添加之后排列它的元素 删除。
否则,无论您是否需要,都会依赖您的要求 有序列表,线程安全等。
答案 4 :(得分:0)
HashMap接受键值对,它允许键和值的空值,而HashMap是非同步的。 HasTable接受键值对,它不允许键值和值的空值,并且HasTable是同步的。
了解更多info