首页 > 解决方案 > HashSet使用HashTable作为数据结构,HashMap作为集合?不推荐使用内存视点数组?

问题描述

按照这个

HashSet 的底层数据结构是 hashtable。

但我也读过 HashSet 在内部使用 HashMap 来避免重复值,而重复值又在内部使用存储桶数组和 LinkedList(在 Java 8 中被树替换)

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

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

这是否意味着 TreeSet 内部不使用 HashMap 来避免重复值? LinkedHashSet 内部使用 HashMap 吗?

按照这个

不推荐使用内存视点数组。

为什么?根据我之前读到的——

由于不能为原始数据类型创建 ArrayList,因此 ArrayList 的成员始终是对不同内存位置的对象的引用(有关详细信息,请参阅此内容)。因此,在 ArrayList 中,实际对象永远不会存储在连续的位置。实际对象的引用存储在连续的位置。在数组中,取决于数组是原始类型还是对象类型。在原始类型的情况下,实际值是连续的位置,但在对象的情况下,分配类似于 ArrayList。

标签: javaarraylistcollectionshashmap

解决方案


小写哈希表是一种通用定义的数据结构,而 javaHashtable类是 Java 中哈希表的同步实现,早于HashMapHashSet类。HashSet 根本不使用Hashtable该类。相反,它使用(同样是小写 h)哈希表数据结构,该结构使用HashMap. Hashtable应该很少在当代代码中使用。根据javadocsHashtable

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

至于你的其他问题:

  • TreeSet 使用与 hashtable 完全不同的数据结构,称为红黑树。有关HashSet 和 TreeSet 之间差异的概述,请参见这个详细的答案。
  • 我不确定“内存视点数组”上的引用是什么意思。那个网站写得不好。

推荐阅读