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值
posted @ 2022-05-16 15:16  张三丰学Java  阅读(95)  评论(0编辑  收藏  举报