进阶——Day07"/>
JavaSE进阶——Day07
1-泛型
1.1-泛型学什么?
1.泛型类
在创建对象的时候,确定具体类型
2.泛型方法
静态方法:调用方法的时候,确定具体类型(根据实际参数去匹配)
非静态方法:跟着类的泛型去匹配
3.泛型接口
1.实现接口的时候,就指定具体的类型
2.让实现类自己,加入泛型(泛型的传递)
4.泛型的限定
?:通配符
?extends E:可以传入的是E,或者是E的子类
?super E:可以传入的是E,或者是E的父类
package com.lyl.fx;
public class Test1 {public static void main(String[] args) {String[] arr1 = {"aaa", "bbb", "ccc"};Integer[] arr2 = {111, 222, 333};printArr(arr1);printArr(arr2);}
public static <T> void printArr(T[] arr) {System.out.print("[");for (int i = 0; i < arr.length - 1; i++) {System.out.print(arr[i] + ", ");}System.out.print(arr[arr.length - 1] + "]");}
}
输出结果:
[aaa,bbb,ccc] [111,222,333]
1.2-好处
-
可以对集合中存储的数据, 进行类型限制
-
避免了强转的麻烦事
package com.lyl.fx;
import java.util.ArrayList;
public class fxDemo1 {public static void main(String[] args) {//没有加泛型的集合,接收数据的时候,都是以Object类型接过来的ArrayList list1 = new ArrayList();list1.add("张三");list1.add("李四");list1.add("王五");//遍历取出的时候,也是Objectfor (Object o : list1) {//向下转型后,才能调用String类里面的方法String s = (String) o;System.out.println(s.length());}//加入泛型ArrayList<String> list2 = new ArrayList<>();list2.add("张三");list2.add("李四");list2.add("王五");//遍历取出的时候也是Stringfor (String s : list2) {//不需要强转了System.out.println(s.length());}}
}
1.3-格式
public class 类名<代表泛型的变量> { }
变量通常写的是 : E T K V
场景:
泛型在定义的时候不具体,使用的时候才变得具体。
在【创建对象】的时候确定泛型的具体数据类型。
例如 : ArrayList 集合类
class ArrayList<E>{public boolean add(E e){}public E get(int index){}...
}
2-Set集合
2.1-Set集合特点回忆
-
无序:存取顺序不一致
-
不重复:可以去除重复
-
无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素。
2.2-要学习的类
TreeSet
:排序、不重复、无索引。
-
【作用 : 排序】
HashSet
: 无序、不重复、无索引。
-
【作用 : 元素去重】
LinkedHashSet
:有序、不重复、无索引。
-
【作用 : 去重, 还要保证顺序不变】
2.3-TreeSet 红黑树
作用 :对数据排序
注意 : 如果存储的是自定义对象, 还没有实现过
Comparable
接口,运行的时候, 将会出现ClassCastException
-
排序方式1 :让类实现
Comparable
接口, 重写compareTo
方法 -
排序方式2 :在构造方法里, 传入
Comparator
, 重写compare
方法
比较规则 :
两种方式中,关于返回值的规则:
如果认为第一个元素大于第二个元素返回正整数即可。
如果认为第一个元素小于第二个元素返回负整数即可。
如果认为第一个元素等于第二个元素返回0即可,此时
Treeset
集合只会保留一个元素,认为两者重复。
如果同时指定两种排序方式 ,优先用比较器的排序方式
3-数据结构-树(了解)
注:数据结构在线演示网站
3.1-树结构介绍
树具有的特点:
-
每一个节点有零个或者多个子节点
-
没有父节点的节点称之为根节点,一个树最多有一个根节点。
-
每一个非根节点有且只有一个父节点
专业名词:
3.2-二叉树
如果树中的每个节点的子节点的个数不超过2,那么该树就是一个二叉树。
3.3-二叉排序树
二叉排序树又称二叉查找树
二叉查找树的特点:
-
左子树上所有的节点的值均小于等于他的根节点的值
-
右子树上所有的节点值均大于或者等于他的根节点的值
-
每一个子节点最多有两个子树
目的:提高检索数据的性能。
中序遍历:取出数据的顺序是
左,中,右
弊端:
二叉查找树有可能会出现"瘸子"的现象,影响查询效率。
3.4-平衡二叉树
平衡二叉树是在满足查找二叉树的大小规则下,让树尽可能矮小,以此提高查数据的性能。
要求:
-
任意节点的左右两个子树的高度差不超过1
-
任意节点的左右两个子树都是一颗平衡二叉树
旋转:
在构建一棵平衡二叉树的过程中,当有新的节点要插入进来以后
我们需要校验新节点的插入是否破坏了树的这种平衡结构,如果是,则需要对树做调整,以改变树的结构
让其成为一个平衡二叉树;而调整就需要涉及到树的旋转
左旋:
-
左旋就是将节点的右支往左拉,右子节点变成父节点
-
并把晋升之后多余的左子节点出让给降级节点的右子节点
右旋:
-
将节点的左支往右拉,左子节点变成了父节点
-
并把晋升之后多余的右子节点出让给降级节点的左子节点
旋转的四种情况:
左左(LL):
左右(LR):
右右(RR):
右左(RL):
3.5-红黑树
-
红黑树不是通过高度平衡的
-
它的平衡是通过“红黑规则”进行实现的
红黑规则 :
每一个节点是红色的,或者是黑色的,根节点必须是黑色。
如果一个节点没有子节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,叶节点是黑色的。
如果某一个节点是红色,那么它的子节点必须是黑色 (不能出现两个红色节点相连的情况)。
对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。
核心 :
根节点是黑色
红色的不能连一起
从任意节点开始, 走到叶子节点 , 左右两边的黑色点数, 需要一致
更多推荐
JavaSE进阶——Day07
发布评论