HashSet 在实现上确实使用了 HashMap 的键(key)部分,而不是值(value)部分。在 HashSet 中,每个元素都被当作 HashMap 的键来存储,而值部分总是同一个静态对象 PRESENT,这是一个 new Object() 的实例。
HashSet 的实现细节
存储机制:
HashSet 底层使用 HashMap 来存储元素。
每个元素都会被当作 HashMap 的键。
所有的值都设为 PRESENT,这是一个静态的 Object 实例。
这样做可以确保 HashSet 中的元素是唯一的,因为 HashMap 保证了键的唯一性。
元素的唯一性:
HashSet 中元素的唯一性是由元素的 hashCode() 和 equals() 方法共同决定的。
当向 HashSet 中添加元素时,它会调用该元素的 hashCode() 方法来计算哈希码,进而确定元素在哈希表中的位置。
如果哈希表中的某个位置已经有元素,HashSet 会调用 equals() 方法来检查是否有其他元素具有相同的哈希码并且相等。
如果找到了相等的元素,则不会添加该元素;否则,元素会被添加到HashMap 中。
内部实现:
HashSet 的内部实现是通过 HashMap 的 KeySet 视图来完成的。
HashSet 的所有操作(如 add, remove, contains 等)实际上是在 HashMap 上进行的。