Java集合:是否使用使用LinkedList实现的哈希表作为其数据结构的具体类HashSet?

Java集合:是否使用使用LinkedList实现的哈希表作为其数据结构的具体类HashSet?,java,collections,Java,Collections,在第782页的《Khalid Mughal编写的Java SCJP认证程序员指南-第三版》一书中,我注意到它说具体类HashSet是使用哈希表和链表实现的。当我浏览主要的java教程网站时,它似乎不是真的。请给我一些建议。谢谢。HashSet是HashMap的包装,HashMap反过来使用数组HashMap是一个哈希表,但不是Hashtable类。HashSet与列表没有任何关系,只是用于解决冲突 LinkedHashSet也有自己的链接列表,但不使用LinkedList类。HashSet是Ha

在第782页的《Khalid Mughal编写的Java SCJP认证程序员指南-第三版》一书中,我注意到它说具体类HashSet是使用哈希表和链表实现的。当我浏览主要的java教程网站时,它似乎不是真的。请给我一些建议。谢谢。

HashSet
HashMap
的包装,HashMap反过来使用数组
HashMap
是一个哈希表,但不是
Hashtable
类。HashSet与列表没有任何关系,只是用于解决冲突


LinkedHashSet
也有自己的链接列表,但不使用
LinkedList
类。

HashSet
HashMap
的包装器,HashMap反过来使用数组
HashMap
是一个哈希表,但不是
Hashtable
类。HashSet与列表没有任何关系,只是用于解决冲突


LinkedHashSet
也有自己的链接列表,但不使用
LinkedList
类。

根据HashSet的代码

public HashSet() {
    map = new HashMap<>();
}
public HashSet(){
map=新的HashMap();
}

基于哈希表的映射接口实现。这个实现提供了所有可选的映射操作,并允许空值和空键。(HashMap类大致相当于Hashtable,只是它不同步并且允许空值。)该类不保证映射的顺序,特别是,它不保证顺序随时间保持不变。

根据HashSet的代码

public HashSet() {
    map = new HashMap<>();
}
public HashSet(){
map=新的HashMap();
}

基于哈希表的映射接口实现。这个实现提供了所有可选的映射操作,并允许空值和空键。(HashMap类大致相当于Hashtable,只是它不同步并且允许空值。)该类不保证映射的顺序,特别是,它不保证随着时间的推移顺序保持不变。

似乎人们会混淆“Hashtable”这一概念和Hashtable这一实现。我猜哈希集也会在内部使用链表,例如对于具有相同哈希代码的对象桶。请查看Oracle对
HashSet
的实现,它很好地显示了内部使用的
HashMap
。Ustaman和Peter Lawrey的陈述有点矛盾。一个说它与列表无关,另一个说它与列表无关。值得注意的是,虽然通常有很好的理由实现与Oracle/OpenJDK版本不同的类,但如果文档中没有指定它,它可能会不同,或者将来可能会更改。我们都说“列表”用于处理冲突(基于hashcode的具有相同bucket的对象),在单词列表的一般含义中。这并不意味着使用
列表
链接列表
类。在没有这样的列表的情况下实现哈希表是可能的(我更喜欢如何实现它;)似乎人们会对“哈希表”感到困惑,概念和Hashtable,一个实现。我猜HashSet也会在内部使用链表,例如对于具有相同hashcode的对象桶。查看Oracle的
HashSet
实现,它很好地显示了内部使用的
HashMap
。Ustaman和Peter Lawrey语句有点矛盾一个说它与列表无关,另一个说它与列表无关。值得注意的是,虽然通常有很好的理由实现与Oracle/OpenJDK版本不同的类,但如果文档中没有指定,它可能不同,或者将来可能会更改。我们都说“列表”在单词列表的一般含义中,用于处理冲突(基于hashcode的相同bucket的对象)。这并不意味着使用
列表
链接列表
类。可以在没有此类列表的情况下实现哈希表(我更喜欢实现它;)如果要查看标准集合类是如何实现的,请在JDK安装目录中的
src.zip
中查找源代码。如果要查看标准集合类是如何实现的,请在JDK安装目录中的
src.zip
中查找源代码.