首页 > 代码库 > 黑马程序员-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、二叉树、泛型