首页 > 代码库 > 黑马程序员-Java基础-集合框架-TreeSet、二叉树、泛型
黑马程序员-Java基础-集合框架-TreeSet、二叉树、泛型
第一讲 TreeSet
1、 概述
TreeSet可以对Set集合中的元素进行排序,按照自然顺序排。
2、 演示代码
输出结果:
总结:TreeSet会对元素进行自然排序,大写排在小写前面。
第二讲 TreeSet存储自定义对象
1、 概述:
将自定义对象存储到TreeSet集合中。
2、 思路:
自定义学生类,并将学生对象存储到TreeSet中,在存储过程中按照年龄排序。
3、 练习:往TreeSet集合中存储自定义对象(学生),并按照学生年龄进行排序
小结:
自定义对象需要重写Comparable接口中的compareTo()方法:因为TreeSet是有序的,在添加元素时,会将新的元素与TreeSet中已有元素进行比较,调用Comparable接口中的compareTo()方法。自定义对象需要定义自己的比较原则,所以要重写Comparable接口中的compareTo()方法。
第三讲 二叉树
1、 概述:
TreeSet的底层数据结构是二叉树,可以对Set集合中的元素进行排序。其保证元素唯一性的依据是:compareTo()方法,如果返回0,则元素重复,元素不添加到集合中。
2、 TreeSet排序
第一种排序方式:让元素自身具备比较性,因此,元素需要实现Comarable接口,覆盖compareTo方法。
第四讲 实现Comparator方式排序
1、 概述:TreeSet的第二种排序方式
当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时就需要让集合自身具备比较性——让集合在初始化时,就有了比较方法
2、 第二种排序方法实现思路
定义一个类,实现Comparator接口,并覆盖接口中的compare方法。以第二讲中学生为例:学生元素自身带有了按年龄排序的方法,但我们的集合需要进行姓名排序,如果要修改学生中的代码比较麻烦,我们可以定义的一个类封装按姓名排序的方法,并将该类对象提供给TreeSet使用。
3、 实现代码如下:
练习:按字符串长度排序
思路:字符串本省具备比较性,但是它的比较方法不是所需的,这时就只能使用比较器。
实现代码如下:
小结:任何对象都可以根据实际要求进行排序,自定排序器并将排序器对象传给集合使用,这种方法比较方便。在比较字符串时,可以直接调用String类中的方法compareTo进行字符串自然排序。
第六讲 泛型概述
1、 定义
泛型:JDK1.5版本以后出现的新特性。用于解决类型安全问题,是一个类型安全机制。
2、 好处
1) 将运行时期出现的问题ClassCastException,转移到了编译时期,方便程序员解决问题,让运行时问题减少,更安全。
2) 避免了读取元素时强制类型转换的麻烦;
3、 代码实现
第七讲 泛型使用
1、 泛型在比较器中的应用
泛型格式:通过<>来定义要操作的引用数据类型。
使用泛型的情况:泛型的时候使用在集合框架中很常见,只要见到<>就要定义泛型(API文档中的接口、类、方法等有<>标识的,在使用它们的时候就需要定义泛型)。
<>标志符:用来接收类型,当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。
2、 代码实现
第八讲 泛型类
1、 定义
定义泛型类的情况:当类中要操作的引用数据类型不确定时,早期的做法是:定义Object来完成扩展。有了泛型之后:可以定义泛型类来完成扩展。
2、 代码实现
第九讲 泛型方法
1、 概述
为了让不同方法可以操作不同类型,而且类型不确定,可以将泛型定义在方法上。定了泛型的方法就是泛型方法。
2、 代码示例
3、 泛型函数特殊之处
静态方法不可以访问类上定义的泛型。如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。
第十讲 泛型接口
实现泛型接口的类,也不确定要处理的数据类型,此时可以将此类定义成泛型。
第十一讲 泛型限定
1、 定义
限定泛型可接收的类型,有“上限定”和“下限定”两种。
1)? extends E :可以接收E类型或这E的字类型,上限定;
2)? super E:可以接收E类型或者E的父类型,下限定;
2、 泛型限定应用
“?”——通配符,也即占位符。
如下代码:利用泛型上限(Person及其子类)定义了一个函数,并用子类(Student)对象调用该函数。
说明:Student和Worker都是Person的子类。用Person类定义了比较器,存储了Student和Worker类型的TreeSet都可以调用该比较器,这体现了泛型下限的特性。
知识点总结
知识点总结
1、 在给TreeSet集合定义比较器时,需要实现Comparator接口中的compare(Object o1,Object o2)方法,若要使得倒序存储,只需将实现比较代码中的o1和o2这两个参数兑换位置。
2、 TreeSet集合中元素的两种排序方法:
1) 定义在元素内部
实Comparable接口中的CompareTo方法。
2) 自定义比较器
实现Comparator接口中的compare方法,并将比较器对象传给集合。
注意:当两者同时存在时,“自定义比较器”优先。
3、 重写equals方法时,不能赋泛型,因此,需要进行强制类型转换后才能使用equals方法。
4、 泛型类的作用:避免了强转,并使类型转换错误发生在编译时期,方便修改。
5、 泛型方法可以提高程序功能的扩展性,使得函数更加通用。
6、 自定义泛型类:只能是自定义的数据类型,不能是基本数据类型。
7、 静态方法不可以访问类上定义的泛型,原因是:
黑马程序员-Java基础-集合框架-TreeSet、二叉树、泛型