Day16 Set、比较器
1. 集合
1、java中的集合类:是一种工具类,就像是容器,储存任意数量的具有共同属性的对象
2、集合的作用
a、在类的内部,对数据进行组织
b、简单而快速的搜索大数量的条目
c、有的集合接口,提供了一系列排列有序的元素,并且可以在序列中间快速的插入或者删除有关的元素
d、有的集合接口,提供了映射关系,可以通过关键字(key)去快速查找到对应的唯一对象,而这个关键字可以使任意类型
3、与数组对比,选择集合
a、数组的长度固定,集合长度可变
b、数组只能通过下标访问元素,类型可变,而有的集合可以通过任意类型查找所映射的具体对象
1.1 Set
set中保存的数据是无序不可重复的
TreeSet : 底层是红黑树(保证元素按照某种顺序排序)
HashSet : 底层是散列
1.1.1 TreeSet
1.1.1.1 概述
java.util/SortedSet
java.util.TreeSet:会按照某种顺序进行排序
数字:从小到大
自符串:每位的ASCII
日期:自然日期
比较器有两种
要添加的元素实现比较器
专门准备一个比较类(优先级高)
进行排序的时候,根据比较器方法的返回值进行比较
如果是0说明重复不添加 如果是大于0的 说明元素大往后放
如果是小于0的,说明要添加的元素小,往前放
1.1.1.2 基本使用
1.1.1.3 注意
如果要使用treeSet 那么 元素必须有比较器,两种都可以
否则就会有类型转换异常
1要添加的原始实现java.lang.Comparable接口并实现compareTo方法2写一个比较器类,实现java.util.Comparator比较器接口
很多常用的类中都实现了Comparable接口并实现compareTo方法比如Integer,String,Date等
所以我们自定义类型的时候,一定要弄比较器类
1.1.2 比较器
可以让集合中的元素按照某个规则进行排序
在源码中体现了,先判断是否有compare() 如果没有再判断是否有compareTo()
所以 Comparator优先级要高于Comparable
1.1.2.1 Comparable
也可以叫元素自身比较器,就是要添加的元素需要实现这个接口,一般在我们的自定义类中常用
因为这种方式,直接让要添加的元素类实现接口就可以,编码方便,而Comparator需要单独写比较器类
因为它优先级低,我们给出的排序规则,如果不满足调用处,它还可以根据Comparator进行排序扩展
此时当调用处进行排序扩展的时候,此时Comparator和Comparable同时存在,则Comparator优先级高,所以最终排序规则会按照调用处指定的规则进行排序
1.1.2.2 Comparator
1 该类有排序(比如Integer实现了Comparable,并且是升序),但是排序规则不是我们想要的,这个时候需要使用Comparator来进行调整排序,因为优先级高
2 如果该类没有排序(没有实现Comparable接口),该类也不是我们写的,如果此时需要排序,则需要使用Comparator来完成
1.1.3 List排序
所以 如果保存我们自定义类型,想要排序,必须有一个比较器类
根据需求决定用哪一种即可
1.2 泛型
1.2.1 概述
类型检查,编译过程中检查类型是否匹配
泛型是在编译阶段对数据的类型进行匹配
优点:统一了数据类型,减少强制类型转换
缺点:只能存储单一类型的数据
结合我们的需求情况,绝大部分情况都是需要保存统一类型的数据,所以大部分情况下,使用泛型要好很多
泛型只能是引用类型,不能是基本类型
1.2.2 基本使用
1.2.3 自定义泛型
泛型本质就是一个占位符,由调用处对这个占位符赋值
如果不赋值,默认是Object
常见的占位符:
?:表示不确定的类型
T:表示一个具体的java类型 Type K:表示keyjava中的键值对V:表示value,E:表示Element,元素,集合中的数据我们叫元素
用什么字母都是可以的,一般都是大写,只是占位符而已
自定义泛型
public class Linked