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-好处

  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("王五");
        //遍历取出的时候,也是Object
        for (Object o : list1) {
            //向下转型后,才能调用String类里面的方法
            String s = (String) o;
            System.out.println(s.length());
        }
        //加入泛型
        ArrayList<String> list2 = new ArrayList<>();
        list2.add("张三");
        list2.add("李四");
        list2.add("王五");
        //遍历取出的时候也是String
        for (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-树结构介绍

树具有的特点:

  1. 每一个节点有零个或者多个子节点

  2. 没有父节点的节点称之为根节点,一个树最多有一个根节点。

  3. 每一个非根节点有且只有一个父节点

 专业名词:

 3.2-二叉树

如果树中的每个节点的子节点的个数不超过2,那么该树就是一个二叉树。

 3.3-二叉排序树

二叉排序树又称二叉查找树

 二叉查找树的特点

  1. 左子树上所有的节点的值均小于等于他的根节点的值

  2. 右子树上所有的节点值均大于或者等于他的根节点的值

  3. 每一个子节点最多有两个子树

目的:提高检索数据的性能。

中序遍历:取出数据的顺序是

左,中,右

弊端:

二叉查找树有可能会出现"瘸子"的现象,影响查询效率。

3.4-平衡二叉树

平衡二叉树是在满足查找二叉树的大小规则下,让树尽可能矮小,以此提高查数据的性能。

 要求:

  • 任意节点左右两个子树高度不超过1

  • 任意节点左右两个子树都是一颗平衡二叉树

旋转

在构建一棵平衡二叉树的过程中,当有新的节点要插入进来以后

我们需要校验新节点的插入是否破坏了树的这种平衡结构,如果是,则需要对树做调整,以改变树的结构

让其成为一个平衡二叉树;而调整就需要涉及到树的旋转 

左旋:

  • 左旋就是将节点的右支往左拉,右子节点变成父节点

  • 并把晋升之后多余的左子节点出让给降级节点的右子节点

右旋:

  • 将节点的左支往右拉,左子节点变成了父节点

  • 并把晋升之后多余的右子节点出让给降级节点的左子节点 

旋转的四种情况:

左左(LL):

左右(LR):

右右(RR):

右左(RL):

3.5-红黑树

  • 红黑树不是通过高度平衡的

  • 它的平衡是通过“红黑规则”进行实现的

红黑规则 :

  1. 每一个节点是红色的,或者是黑色的,根节点必须是黑色

  2. 如果一个节点没有子节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,叶节点是黑色的。

  3. 如果某一个节点是红色,那么它的子节点必须是黑色 (不能出现两个红色节点相连的情况)。

  4. 对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。

核心 :

  1. 根节点黑色

  2. 红色不能连一起

  3. 任意节点开始, 走到叶子节点 , 左右两边的黑色点数, 需要一致

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值