黑马程序员-Java基础-集合框架-TreeSet、二叉树、泛型

第一讲 TreeSet程序员

一、  概述安全

TreeSet能够对Set集合中的元素进行排序,按照天然顺序排。数据结构

二、  演示代码框架

           

输出结果:函数

总结:TreeSet会对元素进行天然排序,大写排在小写前面。3d

 

 

第二讲  TreeSet存储自定义对象对象

一、 概述:blog

将自定义对象存储到TreeSet集合中。排序

二、 思路:接口

自定义学生类,并将学生对象存储到TreeSet中,在存储过程当中按照年龄排序。

三、 练习:往TreeSet集合中存储自定义对象(学生),并按照学生年龄进行排序

小结:

自定义对象须要重写Comparable接口中的compareTo()方法:由于TreeSet是有序的,在添加元素时,会将新的元素与TreeSet中已有元素进行比较,调用Comparable接口中的compareTo()方法。自定义对象须要定义本身的比较原则,因此要重写Comparable接口中的compareTo()方法。 

 

 

第三讲  二叉树

一、  概述:

TreeSet的底层数据结构是二叉树,能够对Set集合中的元素进行排序。其保证元素惟一性的依据是:compareTo()方法,若是返回0,则元素重复,元素不添加到集合中。

二、  TreeSet排序

第一种排序方式:让元素自身具有比较性,所以,元素须要实现Comarable接口,覆盖compareTo方法。 

第四讲  实现Comparator方式排序

一、  概述:TreeSet的第二种排序方式

当元素自身不具有比较性时,或者具有的比较性不是所须要的,这时就须要让集合自身具有比较性——让集合在初始化时,就有了比较方法

二、  第二种排序方法实现思路

定义一个类,实现Comparator接口,并覆盖接口中的compare方法。以第二讲中学生为例:学生元素自身带有了按年龄排序的方法,但咱们的集合须要进行姓名排序,若是要修改学生中的代码比较麻烦,咱们能够定义的一个类封装按姓名排序的方法,并将该类对象提供给TreeSet使用。

三、  实现代码以下:

练习:按字符串长度排序

思路:字符串本省具有比较性,可是它的比较方法不是所需的,这时就只能使用比较器。

实现代码以下:

   

小结:任何对象均可以根据实际要求进行排序,自定排序器并将排序器对象传给集合使用,这种方法比较方便。在比较字符串时,能够直接调用String类中的方法compareTo进行字符串天然排序。

 

 

第六讲  泛型概述

一、  定义

泛型:JDK1.5版本之后出现的新特性。用于解决类型安全问题,是一个类型安全机制。

二、  好处

1)  将运行时期出现的问题ClassCastException,转移到了编译时期,方便程序员解决问题,让运行时问题减小,更安全。

2)  避免了读取元素时强制类型转换的麻烦;

三、  代码实现

 

第七讲  泛型使用

一、  泛型在比较器中的应用

泛型格式:经过<>来定义要操做的引用数据类型。

使用泛型的状况:泛型的时候使用在集合框架中很常见,只要见到<>就要定义泛型(API文档中的接口、类、方法等有<>标识的,在使用它们的时候就须要定义泛型)。

<>标志符:用来接收类型,当使用集合时,将集合中要存储的数据类型做为参数传递到<>中便可。

二、  代码实现

 

 

第八讲  泛型类

一、  定义

定义泛型类的状况:当类中要操做的引用数据类型不肯定时,早期的作法是:定义Object来完成扩展。有了泛型以后:能够定义泛型类来完成扩展。

二、  代码实现

 

第九讲  泛型方法

一、  概述

为了让不一样方法能够操做不一样类型,并且类型不肯定,能够将泛型定义在方法上。定了泛型的方法就是泛型方法。

二、  代码示例

三、  泛型函数特殊之处

静态方法不能够访问类上定义的泛型。若是静态方法操做的应用数据类型不肯定,能够将泛型定义在方法上。

第十讲  泛型接口

实现泛型接口的类,也不肯定要处理的数据类型,此时能够将此类定义成泛型。

 

第十一讲  泛型限定

一、  定义

限定泛型可接收的类型,有“上限定”和“下限定”两种。

1)? extends E :能够接收E类型或这E的字类型,上限定;

2)? super E:能够接收E类型或者E的父类型,下限定;

二、  泛型限定应用

“?”——通配符,也即占位符。

以下代码:利用泛型上限(Person及其子类)定义了一个函数,并用子类(Student)对象调用该函数。

说明:Student和Worker都是Person的子类。用Person类定义了比较器,存储了Student和Worker类型的TreeSet均可以调用该比较器,这体现了泛型下限的特性。

 

 

知识点总结

知识点总结

一、  在给TreeSet集合定义比较器时,须要实现Comparator接口中的compare(Object o1,Object o2)方法,若要使得倒序存储,只需将实现比较代码中的o1和o2这两个参数兑换位置。

二、  TreeSet集合中元素的两种排序方法:

1)  定义在元素内部

实Comparable接口中的CompareTo方法。

2)  自定义比较器

实现Comparator接口中的compare方法,并将比较器对象传给集合。

注意:当二者同时存在时,“自定义比较器”优先。

三、  重写equals方法时,不能赋泛型,所以,须要进行强制类型转换后才能使用equals方法。

四、  泛型类的做用:避免了强转,并使类型转换错误发生在编译时期,方便修改。

五、  泛型方法能够提升程序功能的扩展性,使得函数更加通用。

六、  自定义泛型类:只能是自定义的数据类型,不能是基本数据类型。

七、  静态方法不能够访问类上定义的泛型,缘由是:

相关文章
相关标签/搜索