set集合
特性:
-
元素不可重复
-
元素无序
实现类:
-
HashSet
-
TreeSet
集合声明语法:
Set接口<泛型> 集合名称 = new Set接口的实现类<>();
HashSet集合
因为HashSet它的底层不是单纯的数组, 所以不具备下标特性, 我们就不能使用普通for循环来遍历集合,同时也不能单纯获取某个元素
数据结构: 哈希表结构 ( 数组 + 链表 )
因为Set集合的初始容量是16, 所以默认使用16索引的数组
元素存储的位置
-
Hash值 % 16 的值 作为元素的存储的位置
-
如果要是存Hash值 % 16 的值 重复, 则判断元素的值是否相同, 如果相同则代表的是这两个数据重复. 如果hash值不同,那么即便两个元素的值相同 系统也会认为是两个不同的元素
-
若hash值相同, 比对元素值是否重复
HashCode和Equals
-
hashCode()和equals()方法的作用都是用来比较两个对象是否相等的
-
hashCode()方法是通过将对象内部地址(物理地址)转换成一个整数, 然后这个整数通过hash算法赶回一个 hasCode值. 再比较时通过比较hashCode值来判断对象是否相等
-
如果hashCode的值相同,那么就开始使用equals()方法比对元素内容
-
如果hashCode的值不相同, 则认为这两个元素不是同一个
LinkedHashSet集合
特性:
-
不可重复 (由数据结构中的哈希表来保证唯一)
-
元素有序 (由数据结构的链表保证元素有序)
TreeSet集合
特性:
-
不可重复
-
构造方法决定排序规则(自然排序(无参构造),比较器(构造中存在比较器))
compareTo() 比较方法
-
如果返回0, 表示元素重复
-
如果返回正数 则升序排序
-
如果返回负数 则降序排序
Comparator 中的比较方法
compare(Student o1, Student o2)
-
第一个参数在前, 第二个参数在后的时候, 升序
-
第一个参数在后, 第二个参数在前的时候, 降序
Comparable 中 比较方法
-
这个形参对象在前, 全局变量在后就是降序
-
这个形参对象在后, 全局变量在前就是升序