当先锋百科网

首页 1 2 3 4 5 6 7

今天继续总结java常用集合Set

set集合是无序、不可重复的容器,set集合主要派生出来的常用的有 HashSet 、TreeSet、 LinkedHashSet

一、HashSet

HashSet是按照Hash算法来存储元素的,因此具有很好的存取和查找性能,HashSet是无序、不可重复的

HashSet具有以下特点

  • 不能保证元素的排列顺序
  • HashSet 不是线程同步的,如果多个线程访问同一个hashSet集合,有第二个线程对hashset进行了改变,必须通过代码来保证同步
  • 集合可以存储null元素

在这里我们既然说HashSet是不可重复的,我们就应该要知道是怎么保证数据部重复的,当向HashSet集合存入一个对象时,HashSet 会调用该对象的hashCode方法取得hashCode值然后决定它的存储位置。如果2个对象的hashCode值不一样,但是equals方法返回为true,它照样会把填加在不同的位置上。

所以HashSet判断2个对象相等:必须hashCode返回值一样,equals方法返回为true。


二、LinkedHashSet

LinkedHashSet是HashSet的子类,因为引用了链表结构所以是有序、不可重复的

LinkedHashSet具有以下特点

  • 能保证元素的排列顺序
  • 不是线程同步的
  • 集合可以存储null元素

LinkedHashSet判断2个对象相等:必须hashCode返回值一样、equals方法返回true。

LinkedHashSet相对HahsSet插入、删除的速度慢,因为需要维护链表的开销,但是在迭代遍历速度上面要快。


三、TreeSet

TreeSet是有序、不可重复的

TreeSet是采用红黑树的数据结构对元素进行排序,支持两种排序方法:自然排序和定制排序,默认自然排序。

判断2个对象相等:equals方法返回true,compareTo方法返回0。

 

HashSet和TreeSet是常用的2个set集合,到底什么时候选择使用哪个呢?

HashSet在插入和查询上面性能要比TreeSet 要好因为TreeSet需要额外的红黑树算法来进行排序,所以如果我们需要一个有序的set集合我们可以考虑使用TreeSet否则都应考虑使用HashSet。