[13]Set集合


一.Set集合

1.什么是Set集合

  • Set集合和List集合类似, 都是可以用来存储对象, 长度可变.

  • Set集合和List不同的是: 没有重复元素, 没有存储顺序.

2.HashSet

  • HashSet是Set的一个实现类, 它可以做到去重复, 效率非常高.

  • 当我们需要把多个对象去重复的时候, 就可以使用HashSet.

  • 存储原理:

  • 使用HashSet存储对象的时候, 会先调用对象的hashCode()方法, 计算一个哈希值.

  • 查找集合中是否有哈希值相同的对象

  • 如果没有就直接存入

  • 如果有哈希值相同的对象, 和相同的对象逐个进行equals比较

  • 如果比较结果全部为false就存入

  • 如果比较结果包含true就不存

  • 用HashSet存储自定义对象:

  • 对象需要重写hashCode()和equals()方法

  • hashCode方法要保证属性相同, 返回值相同, 属性不同尽量不同.

  • equals方法要确保属性相同的返回true, 不同的返回false.

3.LinkedHashSet

  • 是HashSet的子类, 实现原理相同, 但可以保留存储顺序.

4.TreeSet

  • TreeSet是Set的一个实现类, 可以去掉重复元素, 可以指定顺序. 按照指定的比较方式比较出元素的大小, 以二叉树形式进行存储.

  • 自然顺序:

  • TreeSet默认按照compareTo方法中的顺序来排序.

  • compareTo是Comparable接口中的抽象方法, 如果想将自定义类的对象装入TreeSet排序, 那么就需要在类上实现Comparable, 重写compareTo方法

  • compareTo方法返回一个int值, TreeSet在存储对象的时候就会调用compareTo方法, 根据int值构建二叉树. 

  • 返回的int值如果是负数就代表小于, 正数代表大于, 0代表相等.

  • 比较器顺序:

  • 在创建TreeSet的时候, 可以在构造函数中传入一个Comparator接口的实现类.

  • 传入Comparator之后, 再向TreeSet中添加元素时, 就会调用Comparator中的compare方法来比较了.


二.练习

  • 1.去掉List集合中的重复元素

  • 2.从键盘输入接收一行字符串, 判断其中出现了多少种字符

  • 3.将一个List<String>中的元素排序

  • 4.自定义一个Person类, 创建若干对象, 装入TreeSet, 按照名字顺序排序, 名字相同的按照年龄排序

  • 5.从键盘接收学生考试信息, 包含语文, 数学, 英语成绩, 按照总分进行排序

  • 请输入学生信息, 输入"quit"为退出:

  • 张三,80,90,80

  • 李四,90,90,80

  • 王五,70,70,70

  • 赵六,60,60,60

  • quit

  • 李四,90,90,80,260

  • 张三,80,90,80,250

  • 王五,70,70,70,210

  • 赵六,60,60,60,180

Set集合_false

Collection1集合


Set集合_元素_02

HashSet2

Set集合_equals_03

Iterator

Set集合_false_04

TreeSet

Set集合_false_05二叉树

Set集合_false_06