今日学习目录:

  • 泛型使用
  • 数据结构
  • List
  • Set

    1 泛型

  • 概述 : 类型参数 , 保存数据类型 ,泛型名就是一个大写的英文字母, 如果有多个泛型 , 那么使用逗号分隔

  • 优点 : 可以在编译时间对类型做检测 , 避免了类型转换异常
  • 注意 : 泛型在运行过程中会被擦除

    1.1自定义泛型类

  • 格式:修饰符 class 类名<泛型名>{};

  • 泛型类中的泛型确定时机 : 创建一个类的对象

    1.2自定义泛型接口

  • 格式: 修饰符 interface 接口名<泛型名>{}

  • 泛型接口中的类型确定时机 :

    • 当一个实现类,实现接口时,确定泛型:
      • class 实现类 implements 接口名{}
    • 当一个实现类,不确定接口的泛型类型是,继续使用泛型类
      • class 实现类 implements 接口名{}

        1.3自定义泛型方法

  • 格式: 修饰符 <泛型名> 返回值类型 方法名(){ 方法体 }

  • 泛型方法中泛型的确定时机 :调用方法传入的类型就是泛型类型

    • 修饰符 void show(T[] 数组名){}

      1.4通配符

  • 符号:<?>:一般是用于方法接收的是一个集合,集合中的泛型为通配符

    • 特点:可以接收任意引用类型的泛型

      1.5受限泛型

  • 受限泛型是用来约束泛型的适用范围

    • 泛型的下限<? super 引用数据类型>: 这里泛型只能是此类型或者此类的父类
    • 泛型的上限<? extends 引用数据类型>: 这里泛型只能是此类型或者此类的子类

      2 数据结构, 各种数据类型的特点:

  • 栈结构:先进后出 ,类似弹夹

  • 队列结构:先进先出,类似排队
  • 数组结构:可以用索引查询很快,增删慢;
  • 链表结构:增删快,不过查询需要从两头开始,查询慢
  • 树结构
    • 普通二叉树:每个节点最多有两个子节点,查询速度比较低
    • 二叉查找树: 每一个节点的左子节点小,右子节点大,可以提高查询速度,但是可能会出现长短腿,需要用平衡树来实现
    • 二叉平衡树:每个节点的左右子树高度差不超过1,如果添加元素破坏了平衡规则,那么会通过旋转保证再是一颗平衡树
    • 红黑树:可以对数据进行排序
      • 红黑树的注意事项:
        • 根节点必须是黑色
        • 如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的
        • 不能出现两个红色节点相连的情况
        • 对每一个节点,从该节点到其所有后代叶节点的最短路径上,均包含相同数目的黑色节点
      • 红黑树的规则:
        • 在添加节点的时候默认是红色的
        • 相连的两个球不能都是红球
    • 父节点是红球的时候
      • 叔叔节点也为红色:
        • 1.将”父节点和叔叔节点”设为黑色
        • 2.将”祖父节点”设为”红色”
        • 3.如果祖父节点为根节点,则将根节点再次变成黑色
      • 叔叔节点为黑色:
        • 1.将”父节点”设为黑色
        • 2.将”祖父节点”设为红色
        • 以祖父节点进行旋转
  • 哈希表结构:保证数据的唯一

    3 List集合 重点

    特点: 1.有序 2.有索引 3.元素可以重复
    实现类:
    Arraylish类: 底层数组结构,查询快,增删慢
    LinkedList类:双向链表,查询慢,增删快

3 Set集合 重点

特点: 1.无序 2.无索引 3.元素唯一
实现类:

  • HashSet类:哈希表结构, 可以保证元素唯一 ,要想保证元素唯一存储元素所在的类必须重写hashCode和equals方法
  • LinkedHashSet类 : 链表 + 哈希表 , 可以保证元素有序和唯一

4. 当日问题小结

4.1 当日遇到的问题

红黑树的以祖父节点旋转有点懵

4.2 出现问题原因

4.3 解决问题方案

自己用网站测试了一下,熟悉了具体的流程