1.不重复元素的容器
1.1如何自定义不能存放重复元素的容器
1、]现在需要我们自己设计一个容器类,不能够添加重复元素(如果元素重复了就添加不进去)
2、在前面我们设计的基于数组的自定义容器类的基础上改版
3、需要在add方法内部判断重复
4、如何判断:
每一次调用add会传入一个参数: 用户希望添加的元素 ele
遍历内部的数组,判断数组中是否包含ele
1.2代码实现

2.HashSet
2.1语法特点:不重复,无序(不保证和添加顺序一致)
1、不能够添加重复元素
2、初体验
可以添加案例:测试不重复和有序。

2.2是否重复判断规则
2.2.1 引入
通过一步步测试发现:我们不同HashSet内部到底是如何判断重复的?
2.2.2判断重复的方式
① 通过添加进去的元素的hashCode+eqauls两者进行比较
② 如果两个对象的hashCode相等 并且 两个对象调用equals结果是true 才认为两个元素重复
③ 示意图

2.2.3验证上面的规则
1打印上面示例中的元素的hashCode和equals的结果
2尝试自定义类,覆写hashCode 和 equals 这两个方法中的代码随便写

3.TreeSet
3.1语法特点
无序:不保证(不记录)我们的添加顺序;但是可以保证添加里面元素是有序的。
public static void main(String[] args) {
Set<String> set = new HashSet<String>();
set.add("catepillar");
set.add("momor");
set.add("bush");
set.add("cateprillar");
System.out.println(set);
}
不重复:不能够添加重复元素(多个心眼)如何判断重复的呢?
3.2简单体验
体验1

结果:虽然打印结果的顺序和添加顺序可能不一致,但是感觉结果是有某种规则排序的
说明String类也实现了Comparable接口,String对象可以调用compareTo方法
体验2

结果:居然不能够放不同的类型,但是编译没有错
体验3:添加自定义的类的对象Student对象

结果:
疑问1:上面的代码添加的都是同种类型的数据,为什么还报错;
疑问2:为什么提示要把Student转成Comparable
正常情况----》 TreeSet 或者 Comparable的文档
3.3 TreeSet的结构(存储原理)分析


3.4自然排序与定制排序(比较器)
3.4.1自然排序 Comparable
从TreeSet的API文档中点击 “自然排序” ---》 Comparable接口中
文档中的描述:
此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法
理解:
如果一个类实现了Comparable接口,可以认为这个类的对象具有自然排序的能力(本质就是这个对象可以调用比较的方法compareTo),这种比较和排序的规则就是自然排序


3.4.2定制排序(比较器)Comparator
1、根据上面的分析,如果我们的对象没有实现Comparable接口,感觉就无法添加到TreeSet中去;(这些对象就没有自然排序的能力);
2、上面的示例设计有点问题:Student类中覆写的compareTo方法按照年龄从小到大排列的,万一有的人也是用我们的Student,希望年龄从大到小进行排列,怎么办?
不管Student里面使用何种规则都不能满足所有的人
3、解决办法:可以给TreeSet单独的提供一个比较器(理解为比较的一个工具)
4、Comparator是一个比较器的接口(标准),必须得有进行比较的方法 :compare(Object o1,Object o2);
自定义一个类实现Comparator接口,其中写比较规则 ---》 比较器的模板
我们现在需要的是一个具体的比较器对象
示例:


3.5 判断重复的标准
1、如果采用的是自然排序调用对象的compareTo方法,如果返回0 表示相等;
2、如果使用的定制排序(比较器),调用比较器的方法compare返回0 表示相等;
网友评论