为什么HashSet的内部实现会创建一个HashMap来存储它的值?

Cho*_*ing 1 java hashmap hashset data-structures

我是编码的HashSet新手,现在正在学习Java中的容器.真正困惑的是,内部实现HashSet还创建了一个私有HashMap对象来存储它的值和一个单例对象PRESENT.

所以我的问题是:

  • 为什么HashSet结构需要一个HashMap对象来存储它的值?(为什么不使用数组结构或链接结构?)
  • 单例对象的用法是什么PRESENT?(用于确定插入是否成功?)

Era*_*ran 7

A HashSet可以被视为a的私有案例HashMap,我们只关心密钥.

使用HashMap实例作为HashSet实现是避免代码重复的手段.而不是复制类中的大部分HashMap代码HashSet(管理存储桶数组的所有代码(包括每个存储桶中的链表或树结构),并找到与给定键匹配的存储桶),JDK开发人员选择重用HashMap代码.

PRESENT实例是一个虚拟实例,用作后台HashMap的值HashSet.它用于避免分配多个虚拟值.

这是评论中的状态:

// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
Run Code Online (Sandbox Code Playgroud)