【系统学习】【Java基础】2-Java进阶知识总结-3-集合-1-补充【泛型、树、数据结构】

泛型

什么是泛型?

含义的理解还不够深入

泛型:指广泛的数据类型

本质:是参数化类型,即操作的数据类型被指定为一个参数。

用途:泛型可以用在类、接口、方法中,分别称为:泛型类、泛型接口、泛型方法。

版本信息:于JDK5版本引入

常见的泛型标识符

ETKVN
ElementTypeKeyValueNumber通配符
集合元素表示任意Java类的类型键类型值类型数值类型表示任意类型
  • 通配符?:可以理解为所有类的父类

泛型类

示例

package com.itheima.day10.generics;

import java.util.ArrayList;

public class GenericsDemo2 {
    public static void main(String[] args) {
        Student<Integer> stu = new Student<>(); // 正确
        Student<int> stu = new Student<>();   // 错误,泛型类只能是引用数据类型
    }
}

class Student<E> {
    private E e;

    public E getE() {
        return e;
    }

    public void setE(E e) {
        this.e = e;
    }
}

特点

  • 泛型类只能写引用数据类型!!
  • 泛型类,只有创建对象的时候,才能确定泛型具体的类型

泛型方法

非静态的泛型方法

特点:根据类的泛型去匹配:类的泛型传入什么类型,方法就传入什么类型

泛型类型确定的时机:类创建实例对象的时候

举例:上述的get()set()方法

静态的泛型方法

特点:必须声明出自己独立的泛型

  • 因为:静态方法随着类的加载而加载,此时类还没创建,就没有具体类型,静态方法就会有问题,所以要声明自己独立的泛型

泛型类型确定的时机:该方法被调用的时候

举例:

package com.itheima.day10.generics;

public class GenericsDemo3 {
    public static void main(String[] args) {

        String[] arr1 = {"张三", "李四", "王五"};
        Integer[] arr2 = {11, 22, 33};
        Double[] arr3 = {11.1, 22.2, 33.3};

        printArray(arr1);
        printArray(arr2);
        printArray(arr3);
    }

    public static <T> void printArray(T[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length - 1; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println(arr[arr.length - 1] + "]");
    }
}

泛型接口

特点:类实现接口的时候,可以有两种选择:确定泛型类型;保留泛型类型

interface Inter<E> {
    void show(E e);
}

示例1:类实现接口的时候,直接确定类型(就变成普通类了)

class InterAImpl implements Inter<String> {

    @Override
    public void show(String s) {
    }
}

示例2:延续接口的泛型,等创建对象的时候确定(变成泛型类)

class InterBImpl<E> implements Inter<E>{

    @Override
    public void show(E e) {
    }
}

通配符

这部分的概念也有点难理解

通配符的类别

?? extends xxx? super xxx
无边际通配符固定上边界统配符固定下边界统配符
<?><? extends E><? super E>
泛型可以接受未知类型的数据(任意类型)限制泛型可以接受的类型为:xxx及xxx的子类、实现接口xxx的类限制泛型 可以接受的类型为:xxx及xxx的父类

示例

// 父类
@Data
abstract class Employee {
    private String name;
    private double salary;

    public abstract void work();
}
// 继承的子类
class Coder extends Employee {
    @Override
    public void work() {
        System.out.println("程序员写代码...");
    }
}

class Manager extends Employee {
    @Override
    public void work() {
        System.out.println("项目经理分配任务...");
    }
}
// 调用
public class GenericsDemo5 {
    public static void main(String[] args) {

        ArrayList<Coder> list1 = new ArrayList<>();
        list1.add(new Coder());

        ArrayList<Manager> list2 = new ArrayList<>();
        list2.add(new Manager());

        method(list1); // 固定上界统配符
        method(list2); // 固定下界统配符
    }

    public static void method(ArrayList<? extends Employee> list){
        for (Employee o : list) {
            o.work();
        }
    }
    
    public static void method1(ArrayList<? super Employee> list){
        for (Object A : list) {
            Employee o = (Employee)A;
            o.work();
        }
    }    
}

树的基本概念

image-20231017154352376

概念理解
节点(结点、Node)上边的每一个圈圈都是一个节点【节点内部存储有:父节点地址、节点数据值、左子节点地址、右子节点地址】
每一个节点的子节点数量【在二叉数中,任意节点的度<=2】
树高整棵树的层数【上边数的树高=4】
根节点最顶层的节点【节点值为22的这个节点,其左子节点为18,右子节点为26,没有父节点】
左子节点【22的左子节点是18】
右子节点【22的右子节点是26】
根节点的左子树【18节点及其所有子节点】
根节点的右子树【26节点及其所有子节点】

什么是二叉树?

二叉树是每个节点最多有两个子树的树结构。

下边相关二叉树,先学习基本特点和优缺点,后续做题的时候,再学习相关原理、方法,写出代码

二叉树–普通二叉树

仅满足二叉树的规则,没有多余的特点

image-20231017155918842

二叉树–二叉查找树

二叉排序树,又称二叉查找树,亦称二叉搜索树

image-20231017155958621

定义规则

  • 若左子树不为空,则左子树上所有节点的值均小于或等于它的根节点的值
  • 若右子树不为空,则右子树上所有节点的值均大于或等于它的根节点的值
  • 任意节点的左右子树,也都是二叉查找树

优缺点

  • 优点:常规情况下,元素查找速度快,每一次查找,筛选掉剩余元素的一半

  • 不足:特殊二叉查找树(所有节点仅有右节点或仅有左节点),每次查找只能过滤掉一个元素,查找速度变得跟数组一样

二叉树–平衡二叉树

image-20240229202425934

定义规则

1、平衡二叉树由若干个节点组成

2、如果一颗二叉树不为空,那么至少拥有一个根节点,且根节点没有父节点

3、每个子节点都符合如下规范:

  • 节点的数值限制:没有键值相等的节点

  • 节点的子节点数量限制:每个节点可以拥有最多两个子节点

  • 节点的左子树数值限制:若任意节点的左子树不空,则左子树上所有的节点值均小于该节点的值

  • 节点的右子树数值限制:若任意节点的右子树不空,则右子树上所有节点的值均大于该节点的值

  • 节点的左、右子树高度限制:节点左树和右树的高度差的绝对值小于等于1

旋转机制

挺巧妙地,用到了再说

二叉树–红黑树

定义规则

用到再说

红黑规则

用到再说

常见数据结构

总体特点

数据结构结构操作特点补充
一端开口(栈顶)
一端封闭(栈底)
从栈顶到栈底:进栈/压栈
从栈底到栈顶:出栈/弹栈
后进先出,先进后出
队列一端开口(后端)
一端开口(前端)
入队列(后端)、出队列(前端)先进先出,后进后出
数组起始地址值、索引根据地址值和索引定位数据查询速度快(且一致):索引+地址值定位;
增、删效率低:增删过程大概率伴随大量数据移动
链表基本组成:节点
本身地址、数据、下一个节点的地址
查询慢:查询任何数据都要从头开始查
增删相对快:查到对应元素,更改节点存储内容即可,不需要多余的移动
存储内存不连续
双向链表基本组成:节点
前一个节点地址、数据、下一个节点的地址
同【链表】存储内存不连续
见【补充知识-树】

结构图

image-20231018152435202

队列

image-20231018152516475

链表(单向链表和双向链表)

节点结构

image-20231017092555108

单项链表和双向链表

image-20231017092826875

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值