Java Set
Java Set
Set 集合有什么特点?它是如何实现元素不重复的?
Set 是 Java 中 Collection 的一个重要分支,用于存储无序且唯一的元素。
常见的 Set 实现类包括 HashSet、LinkedHashSet 和 TreeSet,它们分别基于不同的数据结构实现唯一性约束。
以 HashSet 为例,它底层是基于 HashMap 实现的,在添加元素时会先计算元素的 hashCode 值确定存储位置,然后再通过 equals 方法进行精确比较,判断是否为重复元素;若已存在相同值,则不再插入。
TreeSet 则依赖元素的自然顺序或提供的 Comparator,通过红黑树维护元素有序性和唯一性。由于 Set 不维护插入顺序(除 LinkedHashSet),也不支持通过索引访问,因此更适用于去重、集合运算等场景。掌握 Set 的去重机制是理解哈希结构和集合操作的重要基础。
说一下 HashSet 的实现原理?
HashSet 本质上是对 HashMap 的一个轻量封装。在 HashSet 中,所有添加的元素都会作为 HashMap 的 key,而对应的 value 是一个固定的常量(通常为 Object 类型的占位符)。
由于 HashMap 的 key 本身就要求不能重复,HashSet 也天然具备了去重特性。当调用 HashSet 的 add()
方法时,会调用底层 HashMap 的 put()
方法,如果元素已存在(即 key 相同),则不会插入成功,从而避免了重复值的出现。
HashSet 的查找、添加等操作时间复杂度通常为 O(1),但性能依赖于元素的 hashCode 和 equals 实现是否合理。需要注意的是,HashSet 不保证顺序,如需顺序性可使用 LinkedHashSet,如需排序可使用 TreeSet。
HashSet、LinkedHashSet 和 TreeSet 有什么区别?
HashSet、LinkedHashSet 和 TreeSet 同属 Set 接口,但特性各有不同:
- HashSet:无序(存储顺序与插入顺序无关),基于 HashMap 实现,查询效率高(平均 O (1)),不保证元素排序。
- LinkedHashSet:继承自 HashSet,底层通过 LinkedHashMap 实现,在哈希表基础上维护了一条双向链表,能保证元素按插入顺序访问,迭代效率高于HashSet,但额外的链表结构会增加内存开销。
- TreeSet:基于红黑树实现,元素会按自然顺序(或自定义比较器)排序,查询、插入、删除的时间复杂度为 O (log n),不允许 null 元素(因排序需要比较,null 无法参与),适用于需要有序遍历的场景。
