根据this
HashSet的底层数据结构是哈希表。
但是我也读过HashSet在内部使用HashMap来避免重复的值,而这些重复的值又在内部使用了bucket数组和LinkedList(在Java 8中被树替换)
那么说HashSet使用HashTable作为数据结构和HashMap作为集合是对的吗?
TreeSet实现了SortedSet接口,因此没有重复值 允许的。
这是否意味着TreeSet没有在内部使用HashMap,HashSet使用它来避免重复值?LinkedHashSet是否在内部使用HashMap?
根据this
不建议使用内存观点数组。
为什么呢? 通过我之前阅读的内容 -
由于无法为原始数据类型创建ArrayList,因此成员 ArrayList始终引用不同内存中的对象 位置(详见)。因此在ArrayList中,实际的 对象永远不会存储在连续的位置。参考文献 实际对象存储在连续的位置。在数组中,它 取决于数组是基本类型还是对象类型。在 在原始类型的情况下,实际值是连续的位置,但是 在对象的情况下,分配类似于ArrayList。
答案 0 :(得分:5)
小写散列表(通常是定义的数据结构)与java Hashtable
类之间存在差异,java javadocs for Hashtable
类是Java中哈希表的同步实现,早于HashMap
和{{1类。 HashSet根本不使用HashSet
类。相反,它使用(再次,小写h)哈希表数据结构,该结构使用Hashtable
实现。 HashMap
应该很少用于当代代码。根据{{3}}:
如果不需要线程安全的实现,建议使用HashMap代替Hashtable。如果需要线程安全的高度并发实现,那么建议使用ConcurrentHashMap代替Hashtable。
至于你的其他问题:
答案 1 :(得分:1)
那么说
HashSet
使用HashTable
作为数据结构而使用HashMap
作为集合是否正确?
不是真的。虽然Java有Hashtable
类,可以追溯到Java 1.0,但HashSet
实现不与该类共享代码。 Geeks For Geeks文章声称HashSet
使用哈希表数据结构而不引用任何特定类。他们声称HashSet
使用哈希表的方法和算法,这是正确的:通过重用HashMap
的代码,该代码基于哈希表方法来构建关联容器,{{1} }也使用哈希表方法。
这是否意味着
HashSet
在TreeSet
内部使用HashMap
来避免重复值?
HashSet
使用TreeSet
,它使用基于比较(而非基于散列)的方法来确保其键的唯一性。
TreeMap
内部使用LinkedHashSet
吗?
是。 HashMap
继承自LinkedHashSet
,因此间接使用HashSet
。