目录
一、Set接口
Set接口时Collection的子接口,set接口没有提供额外的方法;
Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个 Set 集合中,则添加操作失败。
Set 判断两个对象是否相同不是使用 == 运算符,而是根据 equals 方法。因此存放到Set集合中的元素一定要注意equals方法的重写。
Set的常用实现类有:HashSet、TreeSet、LinkedHashSet。
二、HashSet
HashSet是基于HashMap实现的,底层采用HashMap来保存元素(有关HasnMap的了解移步到另一篇)。因此HashSet的实现比较简单,对于HashSet的实现,基本上都是直接调用底层HashMap的相关方法来实现的,对于保存到HashSet中的对象是应该覆盖hashCode()和equal()。
实现的接口有:Serializable,Cloneable,Iterable<E>,Collection<E>, Set<E>。
HashSet是Set接口的典型实现类;按照Hash算法来存储集合中的圆度,具有很好的存取和查找性能。
HashSet集合判断两个元素是否相等的标准:通过 hashCode() 方法比较相等,并且两个对象的 equals() 方法返回值也相等。
当向HashSet集合中存入一个元素时,HashSet会先计算该对象的hashCode()值来判断对象加入的位置,如果有其他元素,则比较hashCode值,如果重复,继续调用equal()方法来比较,相同为重复,添加失败;不同则添加成功。
HashSet的特点:元素无序;线程不安全;集合元素可以有一个是null;
HashSet的底层是数组:初始容量为16,当如果使用率超过0.75,就会扩大到原来的2倍(与HashMap相同)。
三、LinkedHashSet
LinkedHashSet是HashSet的子类。
LinkedHashSet根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这使得元素看起来是以插入元素保存的。
LinkedHashSet插入的性能不如HashSet,但在迭代访问Set里的全部元素时有很好的性能。
LinkedHashSet是不允许元素重复的。
LinkedHashMap是HashMap的一个子类,具有和HashMap相同的存储结构和扩容机制,在此基础上增加了head(头节点)和tail(尾节点)。
四、TreeSet
TreeSet集合内部使用TreeMap作为存储结构,所以在遍历TreeSet时,输出的元素是有序的。所以,添加的元素必须正确实现Comparable接口,如果没有实现Comparable接口,那么创建TreeSet时必须传入一个Comparator对象。
TreeSet的底层是二叉树。可以保证对象元素的唯一性。