HashSet是Java中的一个基于哈希表(Hash Table)的集合类,它实现了Set接口(如下所示为源码),用于存储不重复的元素,其内部使用了一个HashMap来存储元素,数据存储结构是数组+链表。在HashSet中,元素被存储为HashMap的键,而值则被设置为一个常量对象PRESENT,那么这也就说明HashSet中的元素实际上是HashMap中的键,而值则是一个固定的对象。
当我们向HashSet中添加元素时,HashSet会调用HashMap的put方法,将元素作为键,而PRESENT作为值存储到HashMap中。由于HashMap的键是唯一的,所以HashSet中的元素也是唯一的。
当我们从HashSet中删除元素时,HashSet会调用HashMap的remove方法,将元素作为键从HashMap中删除。
HashSet的主要优点是它提供了**时间复杂度为O(1)**的插入、删除和查找操作。但是HashSet并不保证元素的顺序,因为它是基于哈希表实现的。
为了能够正确地使用HashSet,存储在HashSet中的元素必须正确地实现hashCode()和equals()方法,因为HashSet在判断元素是否重复时,会使用元素的hashCode()方法计算哈希值,再使用equals()方法进行比较,如果这两个方法没有正确地被实现,那么很有可能会导致HashSet无法正确判断元素是否是唯一的。