详解LinkedList中的底层实现
1.LinkedList的构造器
- 无参构造器
/*** Constructs an empty list.*/
public LinkedList() {
}
- 构造Collection: 只要是 Collection 下的实现类都可以被 LinkedList 构造
// ? extends E: 只要是E的子类及E类型的类都可以使用
public LinkedList(Collection<? extends E> c) {// 调用无参构造器this();// 把集合 c 中的所有元素都添加到 LinkedList 的对象中addAll(c);
}
2.添加元素
- 头插: 把元素插入到链表的开头
public void addFirst(E e) {linkFirst(e);
}// 进行头插
private void linkFirst(E e) {// f 指向了头节点final Node<E> f = first;// 把 newNode 连接起来, newNode.next = f;final Node<E> newNode = new Node<>(null, e, f);// 让first 重新指向头节点first = newNode;// 判空if (f == null)last = newNode;elsef.prev = newNode; //连接起来后面的节点// 长度自增size++;modCount++;
}
- 尾插: 把元素添加到链表的最后
public boolean add(E e) {linkLast(e);return true;
}// 真正进行尾插的地方
void linkLast(E e) {// l 指向 last, 即链表的最后一个位置final Node<E> l = last;// newNode 绑定了 prev, 即 newNode.prev = l;final Node<E> newNode = new Node<>(l, e, null);// 更新尾结点; last 为空, 则更新 newNode 为尾结点last = newNode;// l 为空, 则说明链表中一个节点都没有if (l == null)first = newNode; // 更新为头节点elsel.next = newNode; // 把 l.next 指向 newNode;size++; // 链表长度 +1modCount++;
}
- 指定位置添加元素
public void add(int index, E element) {// 判断 index 是否合理checkPositionIndex(index);// index 为链表的长度if (index == size)linkLast(element); // 尾插else// node(index) 找到要插入的位置, 然后进行插入linkBefore(element, node(index));
}// succ 为要插入的位置, e 为要插入的值
// 尾插上面代码已经体现, 还要头插和任意位置插入未体现
void linkBefore(E e, Node<E> succ) {// assert succ != null;// pred 为插入位置的前一个final Node<E> pred = succ.prev;// 绑定 newNode.prev = pred, newNode.next = succ;final Node<E> newNode = new Node<>(pred, e, succ);// 前面已经知道了 newNode 的 prev 和 next, 还差 pred.next 和 succ.prev// 这个地方是绑定 succ.prevsucc.prev = newNode;// 说明要插入的节点是头节点if (pred == null)first = newNode; // 头插else// 任意位置, 绑定 pred.nextpred.next = newNode;size++; // 链表长度 +1modCount++;
}
- 指定位置添加另一个集合中的所有元素
public boolean addAll(Collection<? extends E> c) {// 从 0 位置开始把集合 c 中的元素全部添加到 LinkedList 的对象中return addAll(size, c);
}// 具体实现细节
public boolean addAll(int index, Collection<? extends E> c) {// 检查下标是否正常checkPositionIndex(index);// 把集合 c 转化成 Object 数组Object[] a = c.toArray();// 获取数组长度int numNew = a.length;// 空数组, 直接返回, 无需构造if (numNew == 0)return false;// 定义前驱和后继节点Node<E> pred, succ;// index 的值和 size 相同, 则需要尾插(? 因为 size 代表当前 LinkedList 对象的元素个数)if (index == size) {succ = null; pred = last; // pred 指向最后一个元素} else {// succ 指向要插入位置的节点succ = node(index);// pred 指向要插入位置节点的前驱节点pred = succ.prev;}// 循环遍历数组 a// 要插入的所有值, 在 pred 的后面插入, 在 succ 的前面插入for (Object o : a) {@SuppressWarnings("unchecked") E e = (E) o; // 强制类型转化, 把 Object 转为特定类型// 进行插入, 让 newNode.prev 指向 pred, newNode.next = null;Node<E> newNode = new Node<>(pred, e, null);// 若 pred 为空, 则说明 succ 是头节点, 即说明前面是进入了 else 语句if (pred == null)first = newNode; // 更新头节点elsepred.next = newNode; // 让 pred 和 newNode 相互连接(串起来)pred = newNode; // 更新节点, 继续插入}// succ 为空, 则说明是尾插法, 即进入了 size == index 内部if (succ == null) {// last 指向最后一个元素last = pred;} else {// 连接 pred 和 succ 节点, 把链表串起来pred.next = succ;succ.prev = pred;}// 添加长度size += numNew;modCount++;return true;
}
3.删除元素
- 头删: 把链表的最后一个元素删掉
public E removeFirst() {final Node<E> f = first;// 链表中一个节点也没有if (f == null)throw new NoSuchElementException();// unlinkFirst 方法中把头节点传过去return unlinkFirst(f);
}// 进行头删
private E unlinkFirst(Node<E> f) {// assert f == first && f != null;// 获取待删除节点的值final E element = f.item;// next 指向待删除节点的下一个节点final Node<E> next = f.next;// 把头节点的值置为 nullf.item = null;// 让 f(头节点)和后面的节点断开f.next = null; // help GC// 头节点重置first = next;// 说明 f 只有一个节点的情况if (next == null)last = null;elsenext.prev = null; // 把 next 的前驱也置为空, 彻底和 f 断开连接size--;modCount++;// 返回删除头节点的值return element;
}
- 尾删: 把链表的最后一个元素删掉
public E removeLast() {final Node<E> l = last;// 一个节点都不存在if (l == null)throw new NoSuchElementException();// 把尾结点传到 unlinkLast 方法中return unlinkLast(l);
}// 进行尾删
private E unlinkLast(Node<E> l) {// assert l == last && l != null;// 获取待删除节点的值final E element = l.item;// 获取待删除节点的前一个节点final Node<E> prev = l.prev;// 把待删除节点的值域和 next 域均置为空l.item = null;l.prev = null; // help GC// 把尾结点重置到待删除节点的前一个节点last = prev;// 只有一个节点的情况, 则 prev 为空, 则需要把头节点也置为空if (prev == null)first = null;else// 删掉最后一个节点, 即和链表前面的链表断开连接prev.next = null;size--;modCount++;return element;
}
- 删除指定节点: 那个节点值和传入要删除的值相同, 则删除该节点
// 删掉节点值与 o 相等的节点
public boolean remove(Object o) {// 判空if (o == null) {// 从头开始遍历节点for (Node<E> x = first; x != null; x = x.next) {// 判断那个的节点值为 null, 则删除这个节点if (x.item == null) {// 待删除的节点传到 unlink 中unlink(x);return true;}}} else { // 给的值不为 null// 遍历链表for (Node<E> x = first; x != null; x = x.next) {// 相等则删除if (o.equals(x.item)) {// 待删除的节点传到 unlink 中unlink(x);return true;}}}// 没有找到有相同的值return false;
}// 删除节点的逻辑
E unlink(Node<E> x) {// assert x != null;// 获取待删除节点的值final E element = x.item;// 获取待删除节点的下一个节点, 可能为空final Node<E> next = x.next;// 获取待删除节点的上一个节点, 可能为空final Node<E> prev = x.prev;// 如果待删除节点的上一个节点为空, 则说明当前待删除节点是头节点if (prev == null) {// 重置头节点, 注: 前驱还没有置空first = next;} else {// 不是头节点, 让待删除节点的上一个节点指向待删除节点的下一个节点, 即跳过待删除节点prev.next = next;// 把待删除节点的前驱置为空x.prev = null;}// 如果待删除节点的下一个节点为空, 则说明待删除节点是尾结点if (next == null) {// 重置尾结点, 注: 后继还没有置空last = prev;} else {// 不是尾结点, 则让待删除节点的下一个节点的前驱指向待删除节点的上一个节点next.prev = prev;// 把待删除节点的后继置为空x.next = null;}// 到达这点, 已经删掉了 x 节点// 把x节点的值置为空x.item = null;size--;modCount++;return element;
}
4.获取/修改元素
- 获取index处的节点值
public E get(int index) {// 判断下标是否合法checkElementIndex(index);// 获取 index 处的值后, 返回return node(index).item;
}// 查找 index 处的节点值
Node<E> node(int index) {// assert isElementIndex(index);// 判断 index 是否在 size 的 1/2 内, 这个设计的目的是提高查找效率if (index < (size >> 1)) {// 定义查询节点Node<E> x = first;// 从头节点开始进行遍历, 一直到 index 处的节点位置for (int i = 0; i < index; i++)x = x.next;// 返回 index 处的节点的位置return x;} else {// 查找的节点在后半段Node<E> x = last;// 从尾结点向前遍历for (int i = size - 1; i > index; i--)x = x.prev;// 返回 index 处的节点return x;}
}
- 修改index处节点的节点值
public E set(int index, E element) {// 判断下标是否合法checkElementIndex(index);// 获取 index 处的节点值Node<E> x = node(index);// 获取原来节点的节点值E oldVal = x.item;// 把节点的节点值进行更新x.item = element;// 返回原先的节点值return oldVal;
}
5.获取元素第一次/最后一次出现的位置
- 获取元素第一次出现的位置
public int indexOf(Object o) {// 计数器, 用于获取目标节点处于那个下标int index = 0;if (o == null) {// 若是 o 为空, 也需要找到 null 在链表中的那个位置, 把这个位置返回for (Node<E> x = first; x != null; x = x.next) {if (x.item == null)return index;index++;}} else {// 不为空, 那么就判断那个节点值和当前的 o 相等, 相等则返回对应的下标for (Node<E> x = first; x != null; x = x.next) {if (o.equals(x.item))return index;index++;}}// 没有找到的情况return -1;
}
- 获取元素最后一次出现的位置
public int lastIndexOf(Object o) {// 计数器, 下标从链表的最后一个位置开始int index = size;if (o == null) {// 若是 o 为空, 也需要找到 null 在链表中的那个位置, 把这个位置返回// 从尾向头开始进行遍历for (Node<E> x = last; x != null; x = x.prev) {index--;if (x.item == null)return index;}} else {// 不为空, 那么就判断那个节点值和当前的 o 相等, 相等则返回对应的下标for (Node<E> x = last; x != null; x = x.prev) {index--;if (o.equals(x.item))return index;}}// 链表中不存在对应的值return -1;
}
6.链表长度
public int size() {return size;
}// size 是 LinkedList 中的一个计数器, 用于记录链表长度的
transient int size = 0;
7.清空链表
public void clear() {// Clearing all of the links between nodes is "unnecessary", but:// - helps a generational GC if the discarded nodes inhabit// more than one generation// - is sure to free memory even if there is a reachable Iterator// 遍历链表, 从头开始一个一个释放所占空间for (Node<E> x = first; x != null; ) {// 记录 x 的下一个节点Node<E> next = x.next;// 把 x 节点释放x.item = null;x.next = null;x.prev = null;// 指向下一个节点x = next;}// 头节点和尾结点置为 nullfirst = last = null;// 长度置为 0size = 0;modCount++;
}
相关文章:
详解LinkedList中的底层实现
1.LinkedList的构造器 无参构造器 /*** Constructs an empty list.*/ public LinkedList() { } 构造Collection: 只要是 Collection 下的实现类都可以被 LinkedList 构造 // ? extends E: 只要是E的子类及E类型的类都可以使用 public LinkedList(Collection<? extends …...
HTML5动漫主题网站 天空之城 10页 html+css+设计报告成品项目模版
📂文章目录 一、📔网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站演示 五、⚙️网站代码 🧱HTML结构代码 💒CSS样式代码 六、🔧完整源码下载 七、📣更多 一、&#…...
【VSCode】如何修改左侧资源管理器字体大小
方法一 左下角的“设置”—> 选择“窗口” —> 找到 Zoom Level,一般1、2效果就挺大的,可以设置小数0.5、负数-1等,具体设置说明见下图: 这个有一点不好的是,不仅仅资源管理器字体变化,整个VSCode界面会跟着变…...
使用 Visual Studio 开发 Windows 服务
Windows 服务是一种后台运行的应用程序,可以在没有用户界面的情况下执行任务。以下是从概念到具体实现的详细说明。 1. 什么是 Windows 服务 Windows 服务是运行在 Windows 操作系统上的应用程序,具有以下特点: 后台运行:无需用…...
类型转换与IO流:C++世界的变形与交互之道
文章目录 前言🎄一、类型转换🎈1.1 隐式类型转换🎈1.2 显式类型转换🎁1. C 风格强制类型转换🎁2. C 类型转换操作符 🎈1.3 C 类型转换操作符详解🎁1. static_cast🎁2. dynamic_cast&…...
go的web框架介绍
Go 语言有许多优秀的 Web 框架,适用于不同类型的 Web 应用开发,涵盖从简单的 API 开发到复杂的微服务架构。以下是一些常见的 Go Web 框架: 1. Gin 简介:Gin 是一个高性能的 Go Web 框架,设计目标是让开发者能够以极…...
WPF+MVVM案例实战与特效(三十一)- 封装一个加载动画的自定义控件
文章目录 1、案例效果2、案例实现1、资源与文件创建2、自定义控件封装3、自定义控件使用4、总结1、案例效果 2、案例实现 在开发WPF应用程序时,我们常常需要一个灵活的加载动画控件,该控件可以根据窗口的大小自动调整其内部元素(如图片、边框和文本)的尺寸,并且能够通过简…...
cocos creator 3.8 抖音、字节跳动录制器 12
property(Node) luzhishijianDisplay: Node null!;//录制时间显示 property(Node) luzhikaishiBut: Node null!;//录制开始 property(Node) luzhijieshuBut: Node null!;//录制结束 luzhikaishiType: boolean false;//是否开始录制开始计时 gameluzhiTime: number 0;onLoa…...
汽车控制软件下载移动管家手机控车一键启动app
移动管家手机控制汽车系统是一款实现车辆远程智能控制的应用程序。通过下载并安装特定的APP,用户可以轻松实现以下功能:远程启动与熄火:无论身处何地,只要有网络,即可远程启动或熄火车辆,提前预冷或预…...
自由学习记录(28)
C# 中的流(Stream) 流(Stream)是用于读取和写入数据的抽象基类。 流表示从数据源读取或向数据源写入数据的矢量过程。 C# 中的流类是从 System.IO.Stream 基类派生的,提供了多种具体实现,每种实现都针对…...
HarmonyOS开发:关于签名信息配置详解
目录 前言 签名信息的重要性 签名的方式 自动化签名 1、连接真机 2、选择 手动签名 (一)生成密钥和证书请求文件 (二)申请调试证书 (三)注册调试设备 (四)申请调试Profil…...
react 组件双向绑定
1. 使用 state 实现双向绑定 对于双向绑定,需要同时处理表单元素的value属性(通过state来设置)和onChange事件(用于更新state)。 import { useState } from "react";const MyComponent () > {const [i…...
k8s api对象,CRD
在Kubernetes项目中,一个API对象在Etcd里的完整资源路径,是由:Group(API组)、Version(API版本)和Resource(API资源类型)三个部分组成 apiVersion: batch/v2alpha1 kind:…...
详解MyBatis之篇一
目录 MyBatis 定义 使用MyBatis操作数据库 创建项目 配置 演示 UserInfo.java UserInfoMapper UserInfoMapperTest 数据准备 自动生成测试类 运行结果 MyBatis 定义 MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避…...
uniapp连接mqtt频繁断开原因和解决方法
mqtt参考文档:MQTT.js 入门教程 | EMQ、MQTT.js 入门教程 - EMQX - 博客园 uniapp引用MQTT频繁断开的问题可能由于以下几个原因导致: 网络不稳定:频繁断开可能是由于网络不稳定导致的,可以尝试优化网络连接。 心跳机制问题&…...
网络安全内容整理二
网络嗅探技术 网络监听 网络监听,也称网络嗅探(Network Sniffing):在他方未察觉的情况下捕获其通信报文、通信内容的技术 网卡的工作模式: 1.广播模式(Broadcast Mode):网卡能够接收网络中的广播信息 2.组播模式(Multicast Mo…...
IDE解说
IDE(Integrated Development Environment,集成开发环境) 是一种集成了多种开发工具的软件应用程序,旨在简化软件开发过程。 IDE 通常包括代码编辑器、编译器或解释器、调试器、构建自动化工具和版本控制系统等组件。通过将这些工…...
安心护送转运平台小程序
安心护送转运平台小程序是一款基于FastAdminThinkPHPUniapp开发的非急救救护车租用转运平台小程序系统,可以根据运营者的业务提供类似短途接送救护服务,重症病人转运服务,长途跨省护送服务。...
mongodb文档字符串批量替换
【mongodb文档字符串批量替换脚本语句】 前言: 1、本方式对于数据量大的情况不适用,执行可能比较慢; 2、数据量大的情况,个人推荐代码层面解决,多线程替换更快: (1)写实体类的方式…...
模拟实现vector(非常详细)
模拟实现vector 1.基本概念2.vector()默认构造函数3.size()4.capacity()5.empty()6.reverse7.push_back()8.pop_back()9.operator[ ]10.resize()11.insert() 1.基本概念 上一节我们讲了vector的概念以及常用的接口,这一节我们讲一下它的实现,它的底层其实…...
证明直纹极小曲面是平面或者正螺旋面.
目录 证明直纹极小曲面是平面或者正螺旋面 证明直纹极小曲面是平面或者正螺旋面 证明:设极小直纹面 S S S的参数表示为 r ( u , v ) a ( u ) v c ( u ) . (u,v)\mathbf{a}(u)v\mathbf{c}(u). (u,v)a(u)vc(u).则 r u a ′ v c ′ , r v c , r u ∧ r v a ′ ∧…...
电子应用设计方案-34:智能镜子系统方案设计
智能镜子系统方案设计 一、引言 智能镜子作为一种新兴的智能设备,将传统镜子与现代科技相结合,为用户提供了丰富的信息展示和交互功能。它不仅可以作为普通镜子使用,还能够显示天气、新闻、日程安排等信息,甚至可以与智能家居设备…...
前端项目从开发到部署全流程介绍
一、项目初始化 创建项目目录 首先创建一个新的项目目录,例如my - front - end - project。使用命令mkdir my - front - end - project && cd my - front - end - project。 初始化项目 使用npm init或yarn init来初始化项目,这会生成一个packag…...
Vue3.0组件之间通信(defineProps 和 defineEmits 及 defineExpose)
前言: 一、父传子 defineProps二、子传父 defineEmits三、子组件暴露属性和方法给父组件 defineExpose四、依赖注入Provide / Inject 在 <script setup> 中必须使用 defineProps 和 defineEmits API 来声明 props 和 emits ,它们具备完整的类型推…...
多种平台上安装部署调试Open5GS(四)
OpenWRT 源码安装 UERANSIM 安装依赖openwrt源码安装cmake其他依赖准备UERANSIM安装测试验证Open5GS 是一个功能完善的开源5G项目,具备5G、4G核心网功能,最新代码支持R17标准, 本系列文章介绍Open5GS在x86、ARM平台上的安装部署方法,并通过搭建UERANSIN、商用5G基站和终端两…...
KST-3D01型胎儿超声仿真体模、吸声材料以及超声骨密度仪用定量试件介绍
一、KST-3D01型胎儿超声仿真体模 KST—3D01型胎儿超声体模,采用仿羊水环境中内置胎龄为7个月大仿胎儿设计。用于超声影像系统3D扫描演示装置表面轮廓呈现和3D重建。仿羊水超声影像呈暗回声(无回波)特性,仿胎儿超声影像呈对比明显…...
论文笔记-WWW2024-ClickPrompt
论文笔记-WWW2024-ClickPrompt: CTR Models are Strong Prompt Generators for Adapting Language Models to CTR Prediction ClickPrompt: CTR模型是大模型适配CTR预测任务的强大提示生成器摘要1.引言2.预备知识2.1传统CTR预测2.2基于PLM的CTR预测 3.方法3.1概述3.2模态转换3.…...
VTK中对于相机camera的设置
1. 相机的核心属性 在 VTK 中,vtkCamera 的核心属性有默认值。如果你不设置这些属性,相机会使用默认值来渲染场景。 Position(默认值:(0, 0, 1)): 默认情况下,相机位于 Z 轴正方向的 (0, 0, 1)…...
小程序解决大问题-物流系统磁盘爆满问题处理
晚上七点,煤矿调运的物流调度系统突然磁盘报名导致服务崩溃。系统用的是微服务,没有详细操作说明,也不敢动,运煤车辆排起了长队,只能联系厂家处理。好在经过30多分钟的处理,服务终于启动,系统运…...
OGRE 3D----5. OGRE和QML事件交互
在现代图形应用程序开发中,OGRE(Object-Oriented Graphics Rendering Engine)作为一个高性能的3D渲染引擎,广泛应用于游戏开发、虚拟现实和仿真等领域。而QML(Qt Modeling Language)则是Qt框架中的一种声明式语言,专注于设计用户界面。将OGRE与QML结合,可以充分利用OGR…...
docker搭建nginx
一. 直接启动nginx镜像 1. 下载nginx镜像 docker pull nginx 2. 运行镜像 docker run -p 8080:80 --name web -d nginx 3. 网址查看 xx.xx.xx.xx:8080 二. 挂在文件启动nginx镜像 1. 拷贝docker文件到本地 docker cp web:/etc/nginx/nginx.conf /root/data/config/nginx…...
Qt之样式表设置总结。。。持续更新
参考文章链接如下: Qt样式表之一:Qt样式表和盒子模型介绍 Qt样式表之二:QSS语法及常用样式 Qt样式表之三:实现按钮三态效果的三种方法 Qt样式表之一:QSS名词解释 Qt样式表之二:常用控件qss Qt样式表之三:QSS奇技淫巧 样式表介绍 Qt样式表是一个可以自定义部件外观的十…...
若依项目源码阅读
源码阅读 前端代码分析 代码生成器生成的前端代码有两个,分别是course.js用于向后端发送ajax请求的接口代码,另一个是index.vue,用于在浏览器展示课程管理的视图组件。前端的代码是基于vue3elementplus。 template用于展示前端组件别的标签…...
Ubuntu20.04运行R-VIO2
目录 1.环境配置2.构建项目3. 运行 VIO 模式4.结果图 1.环境配置 CMakeLists.txt中 C 使用 14、opencv使用4 2.构建项目 克隆代码库: 在终端中执行以下命令克隆项目:git clone https://github.com/rpng/R-VIO2.git编译项目: 使用 catkin_m…...
【Python运维】容器管理新手入门:使用Python的docker-py库实现Docker容器管理与监控
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着容器技术的广泛应用,Docker已经成为开发和运维中的标准工具之一。使用Python语言管理Docker容器,不仅可以自动化繁琐的容器操作,还能…...
SQL基础入门——SQL基础语法
1. 数据库、表、列的创建与管理 在SQL中,数据库是一个数据的集合,包含了多个表、视图、索引、存储过程等对象。每个表由若干列(字段)组成,表中的数据行代表记录。管理数据库和表的结构是SQL的基础操作。 1.1 创建数据…...
Lumos学习王佩丰Excel第十八讲:LOOKUP函数与数组
一、回顾统计函数 1、使用SUMIF函数 sumif(条件区域,求和条件,求和区域) 2、使用SUMIFS函数 SUMIFS(求和范围, 条件范围1, 条件1, 条件范围2, 条件2, ...) 二、认识数组 1、数组生成原理 所谓数组,是有序的元素序列。组成数组的各个变量称为数组的元素。对于Ex…...
第二节——计算机网络(四)物理层
车载以太网采用差分双绞线车载以太网并未指定特定的连接器,连接方式更为灵活小巧,能够大大减轻线束重量。传统以太网一般使用RJ45连接器连接。车载以太网物理层需满足车载环境下更为严格的EMC要求,100BASE-T1\1000BASE-T1对于非屏蔽双绞线的传…...
【接口封装】——11、Qt 的单例模式
宏定义: Q_GLOBAL_STATIC(NotifyManager,theInstance) 函数定义: class NotifyManager : public QObject {Q_OBJECTpublic:NotifyManager(QObject *parent nullptr);~NotifyManager();static NotifyManager*getInstance(); //单例模式 } 源代码&#…...
理解字母形状,从而获得含义
英文字母,都是象形符号,所以,理解其形象,所象之形,是一项重要的工作,和非常有意义事情。也是我们快速记住大量单词,将单词从底层逻辑开始理清,融会贯通扩展记忆容量的重要办法之一。…...
redis揭秘-redis01-redis单例与集群安装总结
文章目录 【README】【1】安装单机【1.1】安装环境【1.2】安装步骤 【2】redis集群主从模式配置【2.1】集群架构【2.2】redis集群主从模式搭建步骤【2.3】redis集群主从模式的问题(单点故障问题) 【3】redis集群哨兵模式配置【3.1】集群架构【3.2】redis…...
mini-spring源码分析
IOC模块 关键解释 beanFactory:beanFactory是一个hashMap, key为beanName, Value为 beanDefination beanDefination: BeanDefinitionRegistry,BeanDefinition注册表接口,定义注册BeanDefinition的方法 beanReference:增加Bean…...
RVO动态避障技术方案介绍
原文:RVO动态避障技术方案介绍 - 哔哩哔哩 我们在开发游戏的时候经常会遇到这样的问题,当我们寻路的时候,其它人也在寻路,如何避免不从其它人的位置穿过。这个叫做动态避障,目前主流的解决方案就是RVO。本节我们来介绍…...
HTML CSS JS基础考试题与答案
一、选择题(2分/题) 1.下面标签中,用来显示段落的标签是( d )。 A、<h1> B、<br /> C、<img /> D、<p> 2. 网页中的图片文件位于html文件的下一级文件夹img中,…...
【C语言】二叉树(BinaryTree)的创建、3种递归遍历、3种非递归遍历、结点度的实现
代码主要实现了以下功能: 二叉树相关数据结构定义 定义了二叉树节点结构体 BiTNode,包含节点数据值(字符类型)以及指向左右子树的指针。 定义了顺序栈结构体 SqStack,用于存储二叉树节点指针,实现非递归遍历…...
MySQL Workbench 数据库建模详解:从设计到实践
目录 数据库建模基础概念MySQL Workbench 简介与安装 什么是 MySQL Workbench?安装与环境配置 MySQL Workbench 数据库建模功能详解 EER 图(实体关系图)数据库反向工程数据库正向工程模型同步与版本管理 MySQL Workbench 数据库建模实战教程…...
【字体】Fire Code连字效果开启
Vscode 开启方法 1、设置字体Fire Code 放在最前面的即可: 2、启用连字 继续往下找到“在 settings.json 中编辑”,然后设置"editor.fontLigatures": true : 保存即可。 Sublime 开启方法 设置中设置字体后,启…...
springboot kafka在kafka server AUTH变动后consumer自动销毁
前言 笔者使用了kafka用来传输数据,笔者在今年10月写了文章,怎么使用配置化实现kafka的装载:springboot kafka多数据源,通过配置动态加载发送者和消费者-CSDN博客 不过在实际运行中,kafka broker是加密的,…...
第六届国际科技创新(IAECST 2024)暨第四届物流系统与交通运输(LSTT 2024)
重要信息 会议官网:www.lstt.org 大会时间:2024年12月6-8日 大会地点:中国-广州 简介 第六届国际科技创新暨第四届物流系统与交通运输国际(LSTT 2024)将于2024年12月6-8日在广州举办,这是一个集中探讨…...
【Vue3】【Naive UI】< a >标签
【Vue3】【Naive UI】< a >标签 超链接及相关属性其他属性 【VUE3】【Naive UI】<NCard> 标签 【VUE3】【Naive UI】<n-button> 标签 【VUE3】【Naive UI】<a> 标签 <a> 标签HTML中的一个锚&…...