java - HashSet使用HashTable作为数据结构,HashMap作为集合?不推荐使用内存视点数组?
问题描述
按照这个
HashSet 的底层数据结构是 hashtable。
但我也读过 HashSet 在内部使用 HashMap 来避免重复值,而重复值又在内部使用存储桶数组和 LinkedList(在 Java 8 中被树替换)
那么,HashSet 使用 HashTable 作为数据结构,使用 HashMap 作为集合是否正确?
TreeSet 实现了 SortedSet 接口,因此不允许重复值。
这是否意味着 TreeSet 内部不使用 HashMap 来避免重复值? LinkedHashSet 内部使用 HashMap 吗?
按照这个
不推荐使用内存视点数组。
为什么?根据我之前读到的——
由于不能为原始数据类型创建 ArrayList,因此 ArrayList 的成员始终是对不同内存位置的对象的引用(有关详细信息,请参阅此内容)。因此,在 ArrayList 中,实际对象永远不会存储在连续的位置。实际对象的引用存储在连续的位置。在数组中,取决于数组是原始类型还是对象类型。在原始类型的情况下,实际值是连续的位置,但在对象的情况下,分配类似于 ArrayList。
解决方案
小写哈希表是一种通用定义的数据结构,而 javaHashtable
类是 Java 中哈希表的同步实现,早于HashMap
和HashSet
类。HashSet 根本不使用Hashtable
该类。相反,它使用(同样是小写 h)哈希表数据结构,该结构使用HashMap
. Hashtable
应该很少在当代代码中使用。根据javadocsHashtable
:
如果不需要线程安全的实现,建议使用 HashMap 代替 Hashtable。如果需要线程安全的高并发实现,那么建议使用 ConcurrentHashMap 代替 Hashtable。
至于你的其他问题:
- TreeSet 使用与 hashtable 完全不同的数据结构,称为红黑树。有关HashSet 和 TreeSet 之间差异的概述,请参见这个详细的答案。
- 我不确定“内存视点数组”上的引用是什么意思。那个网站写得不好。
推荐阅读
- xcode - 在 iOS 模拟器中找不到自定义位置
- entity-framework - 使用 LocalDB 在 Raspbian 上托管 ASP.NET Core 应用程序
- angular - 我们是否需要为 Angular 中的主题定义 ngOnDestroy?
- javascript - 如何在交叉引用私有成员的文件之间拆分 ES6 类定义?
- r - Rstudio 错误:CCbigguy_addmult (4) 中的溢出,BIGGUY 错误是致命的
- c# - 第一个等待功能后第二个功能未执行
- jenkins - 活动复选框的 Jenkins 管道动态选择参数列表
- c++ - 如何用 const 实参初始化非 const 成员变量?
- r - DbWriteTable() 将我的数据的多个副本写入 SQLite
- php - 旧主题上的 PHP 7 错误 - Prestashop 1.6 / Thirtybees:'不能将字符串偏移量用作数组'