Java
常见数据结构
概述
- 数据结构是计算机底层存储,组织数据的方式,是指数据相互之间是以说明方式排在一起的
- 通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率
常见的数据结构有
-
栈
- 先进后出,后进后出
- 存取元素只能在栈尾进行,栈头不能动
-
队列
- 先进先出,后进后出
- 存元素在队尾进行,取元素在队头进行
-
数组
- 数组是一种查询快,增删慢的模型
- 查询速度快:查询数据通过地址值和索引定位,查询任意数据耗时相同.(元素在内存中是连续存储的)
- 删除效率低: 要将原始数据删除,同时后面的每个元素前移
- 添加效率极低:添加位置后的每个数据后移,再添加元素.
-
链表
- 链表查询慢.无论查询哪个数据都要从头开始找
- 链表增删相对快
- 链表中的元素是再内存中不连续存储的,每个元素节点包含数据和下一个元素的地址
- 添加一个链表
- 首先创建一个相同的链表空间,将上一个链表的next指向此链表,并将此链表的next地址赋值为空
- 删除一个链表
- 首先查询链表中是否存在要删除的链表,存在则找到要删除的下一个链表地址并赋值给上一个链表的next.
- 链表首位增删快
-
二叉树
- 只能有一个根节点,每个节点最多支持两个直接子节点
- 节点的度:节点拥有的子树的个数,二叉树的度不大于2,叶子节点度为0 的节点,也称之为终端节点
- 高度:叶子节点的高度为1,叶子节点的父节点高度为2,一次类推,根节点的高度最高
- 层:根节点再第一层,以此类推
- 兄弟节点:拥有共同父亲的节点互称为兄弟节点
-
二叉查找树
- 又称二叉排序树,二叉搜索树
- 目的:提高检索数据的性能
- 特点
- 每一个节点上最多又两个子节点
- 左子树上的所有节点的只都小于根节点的值
- 右子树上所有节点的值都大于根节点的值
- 添加节点的规则
- 小的存左边
- 大的存右边
- 一样的不存
-
平衡二叉树
- 平衡二叉树是在满足查找二叉树的大小的规则下,让树尽可能矮小,以此提高查找数据的性能
- 要求
- 任意节点的左右两个子树的高度差不超过1,任意节点的左右两个子树都是一颗平衡二叉树
- 添加元素后可能造成不平衡
- 哪边高往哪边拉
- 基本策略是进行左旋,或者右旋保证平衡
- 平衡二叉树- 旋转的四种情况
- 左左
- 右旋
- 左右
- 先左旋,再右旋
- 右右
- 左旋
- 右左
- 先右旋,再左旋
- 左左
- 面试题 画1 2 3 4 5 6 7的平衡2叉树
-
红黑树
-
增删改查的性能都很好
-
红黑树是一种自平衡的二叉查找树,是计算机科学中用到的一种数据结构
-
1972年出现,当时被称为平衡二叉树,1978年被修改为如今的"红黑树"
-
每一个节点可以是红或者黑;红黑树不是通过高度平衡的,它的平衡是通过"红黑规则"进行实现的
-
红黑规则
- 每一个节点或是红色的,或者是黑色的,根节点必须是黑色.
- 如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil这些Nil视为叶节点,叶节点是黑色的
- 如果某一个节点是红色,那么特点子节点必须是黑色(不能出现两个红色节点相连的情况)
- 对每一个节点,从该节点到其所有后代节点的简答路径上,均包含相同数目的黑色节点
每个节点均包含
父节点地址,值,左子节点地址,右子节点地址,颜色
-
添加节点
- 添加的节点的颜色,可以是红色的,也可以是黑色的
- 默认用红色效率高
-
List
ArrayList集合底层原理
- ArrayList底层是基于数组实现的:根据索引定位元素快,增删需要元素的移位操作.
- 第一次常见集合并添加第一个元素的时候,在底层创建一个默认长度为10的数组
- 当输入元素超过默认长度时,他会自动扩充数组长度,长度为原来的1.5倍
LinkedList集合底层原理
- 特点 : 底层数据结构是双链表,查询慢,首尾操作的速度是极快的,所以多了很多首位操作的特有API
- 特有功能
方法名称 | 说明 |
---|---|
public void addFirst(E e) | 在该列表开头插入指定的元素 |
public void AddLast(E e) | 将指定位置的元素追加到此列表的末尾 |
public E getFirst() | 返回此列表中的第一个元素 |
public E getLast() | 返回此列表中的最后一个元素 |
public E removeFirst() | 从此列表中删除并返回第一个元素 |
public E removeLast() | 从此列表中删除并返回最好有个元素 |
集合的并发修改异常问题
- 当我们从集合中找出蘑菇元素并删除时可能出现一种并发修改异常问题
哪些遍历存在问题
- 迭代器遍历集合且直接使用集合删除元素的时候可能出现
- 增强for循环遍历集合且直接用集合删除元素的时候可能会出现
解决方法
- 迭代器遍历集合但是用迭代器自己的删除方法操作可以解决
- 使用for循环遍历并删除元素不会存在这个问题.
泛型
- JDK 5 中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查
- 泛型的格式:<数据类型>;
- 泛型只能支持引用数据类型
- 集合体系的全部接口和实现类全都是支持泛型的使用的
好处
- 统一数据类型
- 把运行时期的问题提前到了编译期间,避免了强制类型转换可能会出现的异常,因为编译阶段类型就能确定下来
泛型类
概述
- 定义类时同时定义了泛型的类就是泛型类
- 泛型类的格式:修饰符 class 类名<泛型变量>()
- public class MyArrayList
() - 此处范例变量T可以随便写为任意标识,常见的如E,T,K,V等
- public class MyArrayList
核心思想
- 把出现泛型变量的地方全部替换成传输的真实数据类型
作用
- 编译阶段可以指定数据类型,类似于集合的作用
泛型方法
概述
- 定义方法的同时定义了泛型的方法就是泛型方法
- 泛型方法的格式:修饰符<泛型变量> 方法返回值 方法名称 (形参列表){}
- public
void show (T t){}
- public
作用
方法中可以使用泛型接收一切实际类型的参数,方法更具备通用性
泛型接口
概述
- 使用了泛型定义的接口就是泛型接口
- 泛型接口的格式:
- 修饰符 interface 接口名称<泛型变量>{}
- public interface Data
{}
作用
泛型接口可以让实现类选择当前功能需要操作的数据类型
原理
- 实现类可以在实现接口的时候传入直接操办的数据模型,这样重写的方法都是针对该类型的操作
通配符:?
- ?可以在"使用泛型"的时候代表一切类型
- E T K V 是在定义泛型的时候使用的
泛型的上下限
- ? extends 父类名 : ? 必须是父类或者其子类 泛型上限
- ? super 类名 : ? 必须是类或者其父类 泛型下限
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!