TreeSet
TreeSet基本知识
TreeSet :
是由TreeMap维护的
无序的,去重的
底层结构 : 红黑树(平衡二叉树)
特点 :查询效率高,去重,默认升序排序
应用场景 : 适合应用在存储多个单个值的数据的集合,去重的,自动升序排序的场景
新增功能 : 新增了一些与比较大小相关的方法:floor、ceiling、higher、lower、first、last
遍历方式 : foreach iterator
去重 : java提供的类型都能实现自动去重,实现升序排序
去重和排序
注意:
在排序之前必须涉及到数据的大小比较,如果存在比较规则,可以比较大小,就可以正常实现排序,但是如果不存在比较规则,无法比较大小,无法排序
TreeSet的去重与排序 : 只根据比较规则实现去重与排序,与equals方法无关
**1.**测试TreeSet是否能够同时存储不同类型的数据 : java.lang.ClassCastException 不能存储多个不同类型数据,因为不是同种类型数据无法比较大小,无法升序排序
**2.**定义TreeSet存储自定义User类型的数据 : java.lang.ClassCastException
查到TreeSet集合中存储的类型数据的比较规则
1)定义TreeSet时候,构造器中通过参数传递比较规则-->外部比较规则
2)检查存储的数据类型是否存在默认的比较规则,如果存在使用,如果还不存在,就抛出异常 -->内部比较规则
比较规则|比较器
比较器|比较规则 :
内部比较器|内部比较规则|自然排序 : 实体类实现java.lang.Comparable接口,重写int compareTo(T o) 方法,方法的内部定义比较规则
int compareTo(T o) : x.compareTo(y)
返回值 : 比较的结果
0 --> x==y
<0 --> x<y
>0 --> x>y
外部比较器|外部比较规则|定值排序 : 实现类实现Comparator接口重写compare方法,方法内部定义比较规则
内部比较器
|自然排序规则|默认比较规则 : 要比较的数据类型内部定义的比较规则
要比较的数据类型(Student)实现Comparable 接口,重写compareTo()方法,方法内部指定比较规则
外部比较器
|定值排序规则|自定义比较规则 : 要比较的数据类型外部定义比较规则
实现Comparator<T>接口,重写compare方法,方法内部定义外部比较规则
可以匿名内部类实现
优缺点分析
内部比较器: 使用简单,但是不便于后期维护
外部比较器: 使用繁琐,但是便于后期维护
注意 : TreeSet集合存储自定义的引用数据类型数据,去重与升序排序都是根据比较规则(比较器) 需要自己实现内部或外部比较器,根据实际情况选择
HashSet
HashSet基础
底层是由HashMap维护的
无序的,去重的
底层结构 : 哈希表(jdk1.8之前:数组+链表 jdk1.8及之后:数组+链表+红黑树)
特点 : 查询增删效率高
应用场景 : 存储数据要求唯一,能自动去重的情况下,查询增删效率都较高可以选择使用HashSet
新增方法 : 没有新增方法
遍历方式 : foreach iterator
去重 : 要求重写哈希表存储的数据类型的hashCode与equals方法,实现根据所有属性值重写,而非根据地址比较计算;
重写hashCode与equals方法的前提下 : 根据所有属性值重写;
equals返回值相等两个对象,调用hashCode肯定相等(相等才能在同一个桶中,才有机会调用equals比较去重); hashCode返回值相等,equals不一定相等;