HashSet使用HashTable作为数据结构,HashMap作为集合使用?不建议使用内存点视图数组?

时间:2018-06-07 14:26:20

标签: java arraylist collections hashmap

根据this

  

HashSet的底层数据结构是哈希表。

但是我也读过HashSet在内部使用HashMap来避免重复的值,而这些重复的值又在内部使用了bucket数组和LinkedList(在Java 8中被树替换)

那么说HashSet使用HashTable作为数据结构和HashMap作为集合是对的吗?

  

TreeSet实现了SortedSet接口,因此没有重复值   允许的。

这是否意味着TreeSet没有在内部使用HashMap,HashSet使用它来避免重复值?LinkedHashSet是否在内部使用HashMap?

根据this

  

不建议使用内存观点数组。

为什么呢? 通过我之前阅读的内容 -

  

由于无法为原始数据类型创建ArrayList,因此成员   ArrayList始终引用不同内存中的对象   位置(详见)。因此在ArrayList中,实际的   对象永远不会存储在连续的位置。参考文献   实际对象存储在连续的位置。在数组中,它   取决于数组是基本类型还是对象类型。在   在原始类型的情况下,实际值是连续的位置,但是   在对象的情况下,分配类似于ArrayList。

2 个答案:

答案 0 :(得分:5)

小写散列表(通常是定义的数据结构)与java Hashtable类之间存在差异,java javadocs for Hashtable类是Java中哈希表的同步实现,早于HashMap和{{1类。 HashSet根本不使用HashSet类。相反,它使用(再次,小写h)哈希表数据结构,该结构使用Hashtable实现。 HashMap应该很少用于当代代码。根据{{​​3}}:

  

如果不需要线程安全的实现,建议使用HashMap代替Hashtable。如果需要线程安全的高度并发实现,那么建议使用ConcurrentHashMap代替Hashtable。

至于你的其他问题:

  • TreeSet使用与哈希表完全不同的数据结构,称为红黑树。参见例如this detailed answer概述了HashSet和TreeSet之间的区别。
  • 我不确定“内存观点数组”的含义是什么意思。该网站写得不好。

答案 1 :(得分:1)

  

那么说HashSet使用HashTable作为数据结构而使用HashMap作为集合是否正确?

不是真的。虽然Java有Hashtable类,可以追溯到Java 1.0,但HashSet实现不与该类共享代码。 Geeks For Geeks文章声称HashSet使用哈希表数据结构而不引用任何特定类。他们声称HashSet使用哈希表的方法和算法,这是正确的:通过重用HashMap的代码,该代码基于哈希表方法来构建关联容器,{{1} }也使用哈希表方法。

  

这是否意味着HashSetTreeSet内部使用HashMap来避免重复值?

HashSet使用TreeSet,它使用基于比较(而非基于散列)的方法来确保其键的唯一性。

  

TreeMap内部使用LinkedHashSet吗?

是。 HashMap继承自LinkedHashSet,因此间接使用HashSet