Set ,HashSet,TreeSet和LinkedHashSet的区别

  1. Set接口
  • Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false。
  • Set判断两个对象相同不是使用==运算符,而是根据equals方法。也就是说,只要两个对象用equals方法比较返回true,Set就不会接受这两个对象。
  1. HashSet
  • HashSet中不能有相同的元素,可以有一个Null元素,存入的元素是无序的。
  • HashSet底层数据结构是哈希表,哈希表就是存储唯一系列的表,而哈希值是由对象的hashCode()方法生成.
  • HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相等
  • 添加、删除操作时间复杂度都是O(1)。
  • 非线程安全
  1. LinkedHashSet
  • LinkedHashSet中不能有相同元素,可以有一个Null元素,元素严格按照放入的顺序排列。
  • LinkedHashSet底层数据结构由哈希表和链表组成。LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起 来像是以插入顺序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。
  • 由于LinkedHashSet的顺序性,LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。(在插入时要对链表进行维护)
  • 添加、删除操作时间复杂度都是O(1)。
  • 非线程安全
  1. TreeSet
  • TreeSet是中不能有相同元素,不可以有Null元素。TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。向TreeSet中加入的应该是同一个类的对象。自然排序使用要排序元素的CompareTo(Object obj)方法来比较元素之间大小关系,然后将元素按照升序排列。如果要定制排序,应该使用Comparator接口,实现 int compare(T o1,T o2)方法
  • TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0
  • 底层的数据结构是红黑树(一种自平衡二叉查找树)
  • 添加、删除操作时间复杂度都是O(log(n))
  • 非线程安全