一.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
Collection1集合
HashSet2
Iterator
TreeSet
二叉树