set不允许元素重复且无序,常用实现有HashSet、LinkedHashSet和TreeSet。
HashSet通过HashMap实现,HashMap的key即HashSet存储的元素,所有key都使用相同的Value,一个名为PRESNT的Object类型常量。使用key保证元素唯一性,但不保证有序性。由于HashSet是HashMAp实现的,因此线程不安全。
HashSet 判断元素是否相等时,对于包装类型直接按值比较。对于类型先比较hashCode是否相同,不同则代表不是同一个对象,相同则继承比较equals,都相同才是同一个对象。
LinkedHashSet 继承自HashSet,通过LinkedHashMap实现,使用双向链表维护元素插入顺序。
TreeSet 通过TreeMap 实现的,添加元素到集合按照比较规则将其插入合适的位置,保证插入后的集合仍然有序。