dw旅游网站设计教程,shopify做旅游网站,广州营销推广公司,沧州兼职网站建设文章目录 泛型什么是泛型#xff1f;常见的泛型标识符泛型类泛型方法泛型接口通配符 树树的基本概念什么是二叉树#xff1f;二叉树--普通二叉树二叉树--二叉查找树定义规则优缺点 二叉树--平衡二叉树定义规则旋转机制 二叉树--红黑树定义规则红黑规则 常见数据结构总体特点结… 文章目录 泛型什么是泛型常见的泛型标识符泛型类泛型方法泛型接口通配符 树树的基本概念什么是二叉树二叉树--普通二叉树二叉树--二叉查找树定义规则优缺点 二叉树--平衡二叉树定义规则旋转机制 二叉树--红黑树定义规则红黑规则 常见数据结构总体特点结构图 泛型
什么是泛型 含义的理解还不够深入 泛型指广泛的数据类型
本质是参数化类型即操作的数据类型被指定为一个参数。
用途泛型可以用在类、接口、方法中分别称为泛型类、泛型接口、泛型方法。
版本信息于JDK5版本引入
常见的泛型标识符
ETKVNElementTypeKeyValueNumber通配符集合元素表示任意Java类的类型键类型值类型数值类型表示任意类型
通配符?可以理解为所有类的父类
泛型类
示例
package com.itheima.day10.generics;import java.util.ArrayList;public class GenericsDemo2 {public static void main(String[] args) {StudentInteger stu new Student(); // 正确Studentint stu new Student(); // 错误泛型类只能是引用数据类型}
}class StudentE {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 InterE {void show(E e);
}示例1类实现接口的时候直接确定类型就变成普通类了
class InterAImpl implements InterString {Overridepublic void show(String s) {}
}示例2延续接口的泛型等创建对象的时候确定变成泛型类
class InterBImplE implements InterE{Overridepublic 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 {Overridepublic void work() {System.out.println(程序员写代码...);}
}class Manager extends Employee {Overridepublic void work() {System.out.println(项目经理分配任务...);}
}// 调用
public class GenericsDemo5 {public static void main(String[] args) {ArrayListCoder list1 new ArrayList();list1.add(new Coder());ArrayListManager 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();}}
}树
树的基本概念 概念理解节点结点、Node上边的每一个圈圈都是一个节点【节点内部存储有父节点地址、节点数据值、左子节点地址、右子节点地址】度每一个节点的子节点数量【在二叉数中任意节点的度2】树高整棵树的层数【上边数的树高4】根节点最顶层的节点【节点值为22的这个节点其左子节点为18右子节点为26没有父节点】左子节点【22的左子节点是18】右子节点【22的右子节点是26】根节点的左子树【18节点及其所有子节点】根节点的右子树【26节点及其所有子节点】
什么是二叉树
二叉树是每个节点最多有两个子树的树结构。 下边相关二叉树先学习基本特点和优缺点后续做题的时候再学习相关原理、方法写出代码 二叉树–普通二叉树
仅满足二叉树的规则没有多余的特点 二叉树–二叉查找树
二叉排序树又称二叉查找树亦称二叉搜索树 定义规则
若左子树不为空则左子树上所有节点的值均小于或等于它的根节点的值若右子树不为空则右子树上所有节点的值均大于或等于它的根节点的值任意节点的左右子树也都是二叉查找树
优缺点 优点常规情况下元素查找速度快每一次查找筛选掉剩余元素的一半 不足特殊二叉查找树所有节点仅有右节点或仅有左节点每次查找只能过滤掉一个元素查找速度变得跟数组一样
二叉树–平衡二叉树 定义规则
1、平衡二叉树由若干个节点组成
2、如果一颗二叉树不为空那么至少拥有一个根节点且根节点没有父节点
3、每个子节点都符合如下规范 节点的数值限制没有键值相等的节点 节点的子节点数量限制每个节点可以拥有最多两个子节点 节点的左子树数值限制若任意节点的左子树不空则左子树上所有的节点值均小于该节点的值 节点的右子树数值限制若任意节点的右子树不空则右子树上所有节点的值均大于该节点的值 节点的左、右子树高度限制节点左树和右树的高度差的绝对值小于等于1
旋转机制
挺巧妙地用到了再说
二叉树–红黑树
定义规则
用到再说
红黑规则
用到再说
常见数据结构
总体特点
数据结构结构操作特点补充栈一端开口栈顶一端封闭栈底从栈顶到栈底进栈/压栈从栈底到栈顶出栈/弹栈后进先出先进后出队列一端开口后端一端开口前端入队列后端、出队列前端先进先出后进后出数组起始地址值、索引根据地址值和索引定位数据查询速度快且一致索引地址值定位增、删效率低增删过程大概率伴随大量数据移动链表基本组成节点本身地址、数据、下一个节点的地址查询慢查询任何数据都要从头开始查增删相对快查到对应元素更改节点存储内容即可不需要多余的移动存储内存不连续双向链表基本组成节点前一个节点地址、数据、下一个节点的地址同【链表】存储内存不连续树见【补充知识-树】
结构图
栈 队列 链表单向链表和双向链表
节点结构 单项链表和双向链表