一:泛型的基本知识
泛型是用来约束操作的数据类型,并进行检查
基本格式:<数据类型>
注意:泛型只能支持引用数据类型,如果是基本数据类型,需要写他的包装类
先来看一下没有泛型约束的集合
我们发现此时里面是Object类 也就是说可以添加所有类型的数据
但是这样获取集合的每一个元素就会出现问题,无法使用子类的特有问题,如果强制类型转换就会出现转换会出现转换异常
这样泛型的作用就能够体现出来
但是Java的泛型是伪泛型(因为泛型的概念是JDK5之后提出的)
泛型的擦除:Java文件到class文件时 就失去了泛型这一概念
所以对于一个集合<String>只是在添加进去会检查是否为 String 进入集合里面还是Object类
元素被调用出去集合就还是String。
泛型的细节:
1.泛型里面不能写基本数据类型(因为最终总是转成Object 基本数据类型转不了)
2.指定泛型的类型之后,可以传递该类类型或者他的子类类型的。
3.如果不写泛型,类型就是默认Object类
二:泛型在不同位置进行定义
如果写在类的后面 叫做泛型类
方法的后面 叫做泛型方法
接口的后面 叫做泛型接口
<1>泛型类
使用场景:当一个类中,某个变量的数据类型不确定时,就可以定义带有泛型的类
此处的E可以理解为变量,但是不是用来记录数据的,而是记录数据的类型,可以写成T,E,K,V
举例
<2>泛型方法
使用场景:方法的形参类型不确定时,可以使用类名后面定义的泛型<E>
举例
<3>泛型接口
使用场景:当一个接口中,某个变量的数据类型不确定时,就可以定义带有泛型的接口
格式
两种使用方式
1.实现类给出具体的类型(实现类确定类型)
给出之后类型就确定了
2.实现类也不明确(实现类也不明确类型)
<4>泛型的继承和通配符
泛型不具备继承性,数据具备继承性
通配符
? 表示所有的类型
? extends E 表示可以传递E或者E所有的子类类型
? super E 表示可以传递E或者E所有的父类类型
应用场景:如果类型不确定,但是我们知道以后只能传递某个继承的体系结构中的,就可以使用泛型的通配符
关键点:限定类型的范围
三:数据结构(树)
树里面的每一个元素叫做节点(Node)
对于一个节点来讲
度:每个节点的子节点的数量
二叉树中,任意节点的度<=2。
树高:树的总层数
根节点:最顶层的节点
对于18及18以下的结构叫做根节点的左子树
对于26及26以下的结构叫做根节点的右子树
<1>二叉查找树
特点:
每个节点最多有两个子节点
任意一个节点的左子树上的值小于该节点
任意一个节点的右子树上的值大于该节点
四种遍历方式:
前序遍历:从根子节点开始,当前节点,左子节点,右子节点的顺序
20 18 16 19 23 22 24
中序遍历(重点):从根子节点开始,左子节点,当前节点,右子节点的顺序
16 18 19 20 22 23 24(从小到大)
后序遍历:从根子节点开始,左子节点,右子节点,当前节点的顺序
16 19 18 22 24 23 20
层序遍历:从根开始,一层一层,从左到右
20 18 23 16 19 22 24
<2>平衡二叉树
任意节点左右子树高度差不超过1
那么平衡二叉树是如何保持“平衡”的呢?
旋转机制
当添加一个节点之后,该树不再是一颗平衡二叉树,就会触发旋转机制
有左旋转和右旋转
左旋转
案例一
添加了12导致不平衡
案例二
右旋转(反过来的左旋转)
案例一
案例二
<3>红黑树
是一个二叉查找树
但是不是高度平衡的具有特殊的红黑规则
红黑规则
1.每个节点要么是红色,要么是黑色
2.根节点一定是黑色
3.如果一个节点没有子节点或者父节点,则该节点相应的指针属性为Nil,这些Nil视为叶节点(均是黑色)
4.如果某个节点是红色他的子节点一定是黑色(不能出现两个红色相连的情况)
5.对于每个节点,从该节点到他所有后代叶节点的简单路径上,均包含相同数目的黑色节点
简单路径:一直走,不回头
对于红黑树的节点会多出一个颜色的属性
添加节点
默认是红色的(效率会更高)
对于红黑树来讲:增删查改效果更好