一、Set子接口
-
特点:无序、无下标、元素不可重复
-
方法:全部继承自Collection中的方法
-
注意:
-
add方法中有equals方法进行判断,如果添加的是重复元素,则不进行添加
-
因为Set没有角标,所以不能使用fori进行遍历,遍历方式只有增强for和Iterator迭代器
-
二、Set实现类
-
HashSet【重点】:
-
基于HashCode计算元素存放位置
-
当存入元素的哈希码相同时,会调用equals进行确认,如果结果为true,则拒绝后者存入
-
存储结构:哈希表(数组+链表+1.8之后的红黑树)
-
存储过程:
-
根据hashCode计算保存的位置,如果此位置为空,则直接保存,如果不为空执行第二步
-
再执行equals方法,如果euqals方法为true,则认为是重复,否则形成链表
-
-
补充:hashCode方法中prime固定默认为31的原因
-
因为31是一个质数,可以减少散列冲突;
-
使用31可以提高效率 31*i =(i<<5)-i
-
-
-
TreeSet:
-
基于排序顺序实现元素不重复
-
实现了SortedSet接口,对集合元素自动排序
-
元素对象的类型必须实现Comparable接口,指定排序规则
-
通过CompareTo方法确定是否为重复元素(在CompareTo方法定义比较规则)
-
存储结构:红黑树
-
要求:元素必须要实现Comparable接口,CompareTo方法返回值为0,则认为是重复元素
-
二叉树左小右大。红黑树根节点必须是黑色,最后一个节点必须是黑色
-
补充:如果不实现Comparalbe接口,可以在构造方法的选取上选取Comparator的实现类(用匿名内部类的方式)来定义,重写compare方法即可
-