Set 有什么特点,有哪些实现
Set 不允许元素重复且无序,常用实现有 HashSet、LinkedHashSet 和 TreeSet。
HashSet
- HashSet 通过 HashMap 实现,HashMap 的 Key 即 HashSet 存储的元素,所有 Key 都使用相同的 Value ,一个名为 PRESENT 的 Object 类型常量。使用 Key 保证元素唯一性,但不保证有序性。由于 HashSet 是 HashMap 实现的,因此线程不安全。
- HashSet 允许有 null 值。
- HashSet 判断元素是否相同时,对于包装类型直接按值比较。对于引用类型先比较 hashCode 是否相同,不同则代表不是同一个对象,相同则继续比较 equals,都相同才是同一个对象。
LinkedHashSet
- LinkedHashSet 继承自 HashSet,通过 LinkedHashMap 实现,使用双向链表维护元素插入顺序。
- 有序、不允许重复
- 由于需要额外维护链表,性能可能略低于HashSet
- 该类提供了所有可选的Set操作,并允许null元素
- 请注意,此实现不同步
- 在HshSet底层存储结构的基础上,额外提供了一对指针记录Node元素的上一个元素和下一个元素,可以按照元素添加的顺序实现遍历
- 对于频繁的遍历,效率高于HashSet
TreeSet
- TreeSet 通过 TreeMap 实现的,添加元素到集合时按照比较规则将其插入合适的位置,保证插入后的集合仍然有序。
- 无法添加null值