Set接口概述
一个不包含重复元素的Collection
Set案例
存储字符串并遍历
存储自定义对象并遍历
HashSet类概述
- 不保证set的迭代顺序
- 特别是它不保证该顺序恒久不变
HashSet如何保证元素唯一性?
- 底层树结构是哈希表(元素是链表的数组)
- 哈希表依赖于哈希值存储
- 添加功能底层以来的两个方法
- int hashCode()
- boolean equals(Object obj)
哈希表:是一个元素为链表的数组。综合了数组和链表的好处(新华字典)
如果对象的哈希值相同了,就会走equals()方法比较变量是否相同,如果不同,添加到集合,相同就不添加
“桶”结构-------(同一页新华字典,可以有相同拼音的汉字很多个)
优化代码:让对象的哈希值尽可能的不同
哈希值和哪些内容相关呢?
和对象的成员变量值相关
所以,最终解决方案:把对象的成员变量值进行相加
如果是基本类型,直接加值
如果是引用类型,加哈希值
为了进一步区分,把他们乘一些整数
LinkedHashSet
具有可预知的迭代顺序的Set接口的哈希表和链表实现
LinkedHashSet:底层数据结构由哈希表和链表组成
哈希表保证元素的唯一性
链表保证元素有序(存储和取出顺序一致)
TreeSet
基于TreeMap的NavigableSet实现,使用元素的自然熟悉怒对元素进行排序,或者根据创建set时提供的Comparator进行排序,具体取决于使用的构造方法
概述:
- 使用元素的自然顺序对元素进行排序
- 根据创建set时提供的Comparator进行排序
- 具体取决于使用的构造方法
TreeSet是如何保证元素的排序和唯一性的?
- 底层数据结构是红黑树(红黑树是一种自平衡的二叉树)
1、登录注册案例(理解)
2、Set集合(理解)
- set集合的特点:无序,唯一
- HashSet集合(掌握)
- 底层数据结构是哈希表(是一个元素为链表的数组)
- 哈希表底层依赖两个方法
- hashCode()
- equals()
执行顺序:
首先比较哈希值是否相同
相同:继续执行equals方法
返回true
返回false
不同:直接把元素添加到集合
c.如何保证元素唯一性的呢?
由这两个方法保证
d.开发的时候代码自动生成即可
- HashSet存储字符串并遍历
- HashSet存储自定义对象并遍历(对象成员变量值相同即为同一个元素)
- TreeSet集合
- 底层数据结构是红黑树(一个自平衡二叉树)
- 保证元素排序的方式
- 自然排序(元素具备比较性)
- 让元素所属的类实现Comparable接口
- 比较器排序(集合具备比较性)
- 让集合构造方法接受Comparator的实现类对象
- 讲过的代码看一遍
4.案例:
- 获取无重复的随机数
- 键盘录入学生按照总分从高到低输出