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集合(理解)

  1. set集合的特点:无序,唯一
  2. HashSet集合(掌握)
  1. 底层数据结构是哈希表(是一个元素为链表的数组)
  2. 哈希表底层依赖两个方法
  1. hashCode()
  2. equals()

执行顺序:

首先比较哈希值是否相同

相同:继续执行equals方法

返回true

返回false

不同:直接把元素添加到集合

c.如何保证元素唯一性的呢?

由这两个方法保证

d.开发的时候代码自动生成即可

  • HashSet存储字符串并遍历
  • HashSet存储自定义对象并遍历(对象成员变量值相同即为同一个元素)
  1. TreeSet集合
  1. 底层数据结构是红黑树(一个自平衡二叉树)
  2. 保证元素排序的方式
  1. 自然排序(元素具备比较性)
  1. 让元素所属的类实现Comparable接口
  1. 比较器排序(集合具备比较性)
  1. 让集合构造方法接受Comparator的实现类对象
  1. 讲过的代码看一遍

4.案例:

  • 获取无重复的随机数
  • 键盘录入学生按照总分从高到低输出