Collection
- 是List和Set的父接口
- 所有集合都是由Collection或者Map派生
特点
- 内部存放List和Set的共性方法
- 没有直接实现类
Set的常用实现类
- HashSet
- JDK1.2 低层哈希表(数组+链表)实现,线程不安全,效率高
- LinkedHashSet
- JDK1.2 是HashSet的子类,底层哈希表实现,线程不安全,效率高
- TreeSet
- JDK1.2 底层红黑树实现,是SortedSet的实现类,线程不安全,效率高
红黑树:树状结构存放数据,使用的是二分查找法,特点为查询效率快
创建
- 建议使用多态
Set<泛型> 集合名=new 实现类名<>();
常用方法
- 所有方法都继承自Collection,无独有方法
遍历
- 迭代器遍历
- 外遍历forEach
- 自遍历forEach
哈希表的去重原理
- 先调用元素的hashCode方法获取哈希码值
- 通过哈希码值%数组长度(16)得到存放下标
- 如果下标位置未存有元素,则直接存放
- 如果下标位置存有元素,这调用当前元素的equals方法与下标位置元素进行值的比较
- 都不相同,在下标位置上继续脸链表存放
- 有相同,则舍弃添加当前元素
使用
- HashSer和LinkedHashSet如果存放的时自定义类型,则必须重写hashCode和equals方法才能实现去重
- LinkedHashSet可以保证 元素存如与取出的顺序一致
- TreeSet可以实现对元素进行默认的升序排序
- 如果TreeSet中存放的时自定义类型,则必须自定义排序规则
- 排序方式:
实现Comparable接口,重写compareTo方法 - 思路:让当前对象this和参数对象o进行比较
- 实现:对谁排序,就让谁实现
- 规则:
从小到大:
this的值>o的值,返回正数
this的值<o的值,返回负数
从大到小:
this的值>o的值,返回负数
this的值<o的值,返回正数
相等返回0
package com.by.entity;
public class Student implements Comparable<Student>{
private String name;
private int age;
private double score;
//省略getter、setter、构造
@Override
public int compareTo(Student o) {
//根据学生成绩从高到底排序
if (this.score > o.score) {
return -1;
} else if (this.score < o.score) {
return 1;
}
return 0;
}
}
- 实现Comparator接口,重写Compare方法
思路:让参数o1和o2进行比较
实现:在集合创建处的小括号内传入实现类对象
Set<Student> set = new TreeSet<>((o1,o2)->{
//根据学生成绩从低到高
if (o1.getScore() > o2.getScore()) {
return 1;
} else if (o1.getScore() < o2.getScore()) {
return -1;
}
return 0;
});
- 默认识别Comparable,但是Comparator优先级更高
- Comparator更能保护类的单一职责,有利于后期代码的维护,集合排序扩展性更高,更推荐该方式
- TreeSet去重规则:当compareTo或compare方法返回值为0时去重
今日掌握
- collection 的特点
- set的存储特点
- set的常用实现类和特点
- set的遍历方式
- 哈希表的去重原理
- TreeSet自定义排序规则的方式
- TreeSet的去重规则