【Java】链表(LinkedList)(图文版)
本博客总结了Java当中链表的实现,以及相关方法的使用,在最后附带了一些常见链表相关处理技巧,希望对你有帮助!
ps:可拷贝到IDEA上自行测试,代码全部完成测试。
一.链表概述
1.什么是链表?
链表(LinkedList) 是一种线性数据结构,由一系列节点(Node) 通过指针(引用)连接而成,每个节点包含两部分:
数据域:存储实际的数据(可以是任意类型)
指针域:存储指向下一个节点(或前一个节点)的引用
顾名思义,就是像链子一样的数据结构,在物理内存上不要求连续,通过引用(Next)套接连接:
想要访问链表元素,只能从头结点进入,顺着链子找到下一个节点,依次访问,直到访问到为节点(Null)
2.链表的分类
链表大致可以分为以下三类:
单链表(Singly Linked List)
双链表(Doubly Linked List)
循环链表(Circular Linked List)
(1)单链表
-
定义:每个节点仅包含一个指向下一个节点的指针(next)。
-
特点:单向遍历,只能从头节点开始访问后续节点。
-
终止条件:最后一个节点的next指向null。
如上图就是一个经典的单链表。
(2)双链表
-
每个节点包含两个指针:next(指向后一个节点)和 prev(指向前一个节点)。
-
特点:支持双向遍历,但需要更多内存存储指针。
(3)循环链表
-
单链表的变种:最后一个节点的next指向头节点。
-
特点:形成一个环,适合需要循环访问的场景。
-
终止条件:遍历时需检查是否回到头节点。
(4)有头/无头指针结构
有头指针结构会有个空的指针作为专门的头指针作为入口,插入只能在头指针之后。
无头指针结构无专门的头指针,以第一个节点作为入口,可以在入口前插入。
有头/无头指针结构与上述3种链表可以任意组合,我们推荐使用有头,因为不需要考虑变更头结点,简化了操作。
为了演示一些错误和注意事项,我们使用无头结构。
3.在集合框架中的位置
属于线性表(List)的一种,能与ArrayList与Stack互转,前提是类型声明为List(之后会介绍)。
4.优缺点
(1)优点
- 高效的增删数据(变动链式关系即可,无需关心空间顺序)
- 动态内存(无需指定大小,因为以节点形式存在)
(2)缺点
- 访问效率低(只能从头访问)
- 内存开销稍大(要存储指针)
二.链表的实现
先简单看一眼Java源码:
不难发现Java使用了内部类的形式存储节点,并且LinkedList这一集合使用的是双向无头链表。
为了便于理解与复现,我们暂且不考虑泛型与io等高阶特性,而使用int存储value。
1.单链表的实现
(1)基本实现
public class MyLinkedListTest {private Node head; //入口,并非哨兵节点private int size; //节点数//节点内部类private static class Node {int val;Node next;public Node(int val) {this.val = val;}}//构造方法public MyLinkedListTest() {this.head = null; //head指向空节点,表示初始化为空this.size = 0;}......
(2)添加元素
//在头部插入
public void addHead(int data) {Node newNode = new Node(data); // 1newNode.next = this.head; // 2 this.head = newNode; // 3this.size++;
}
头插示意图:
step1:
step2:
step3:
//在尾部插入
public void addTail(int data) {Node newNode = new Node(data);Node current = this.head;if (head == null) { //链表为空的情况this.head = newNode;}else{ //链表不为空的情况while (current.next != null) {current = current.next;}//改链接current.next = newNode;}this.size++;
}
尾插示意图:
step1:
step2:
step3:
//在指定位置插入
public void addIndex(int index, int data) {//下标合法性判断if (index < 0 || index > size) { System.out.println("illegal index");return;}Node newNode = new Node(data);//是否头插?if (index == 0) {addHead(data);return;}//是否尾插if (index == size) {addTail(data);return;}Node prev = this.head;Node cur = prev.next;//找位置for (int i = 1; i < index; i++) {prev = cur;cur = cur.next;}//改链接prev.next = newNode;newNode.next = cur;
}
指定位置插入示意图:
(3)遍历输出
public void display() {Node current = head;System.out.print("Head -> ");while (current != null) {System.out.print(current.val + " -> ");current = current.next;}System.out.println("null");
}
(4)删除元素
//删除第一个遇见的元素
public void remove(int key) {if (this.head == null) {return;}if (this.head.val == key) {this.head = this.head.next;}Node prev = this.head; //当前节点的前驱节点Node cur = prev.next; //当前节点while (cur != null) {if (cur.val == key) {//改链接prev.next = cur.next;this.size--;return;}//指针遍历prev = cur;cur = cur.next;}System.out.println("not find");
}//删除所有value == key的元素
public void removeAllKey(int key) {if (this.head == null) {return;}//头结点 val == key的情况,循环删除直到头val不为keywhile (head.val == key && head.next != null) {this.head = this.head.next;}//指针遍历Node prev = this.head;Node cur = prev.next;while (cur != null) {if (cur.val == key) {//改链接prev.next = cur.next;cur = cur.next;this.size--;}else {//指针遍历prev = cur;cur = cur.next;}}
}//删除所有元素
public void clean(){this.head = null;this.size = 0;
}
删除元素示意图(cur:当前要删除的元素):
(5)查找元素
public boolean contains(int key) {Node current = this.head;while (current != null) {if (current.val != key) {current = current.next;continue;}return true;}return false;
}
2.双链表的实现
(1)基本实现
public class MyLinkedList {//节点内部类private static class Node {int data;Node next;Node prev;public Node(int data) {this.data = data;this.next = null;this.prev = null;}}private Node head;private Node tail;private int size;//构造方法public MyLinkedList() {this.head = null;this.tail = null;this.size = 0;}......
(2)添加元素
//头插法
public void addFirst(int data) {Node newNode = new Node(data);//空链表情况下if (this.head == null) {this.head = newNode;this.tail = newNode;}else{//非空链表情况下this.head.prev = newNode;newNode.next = this.head;this.head = newNode;}size++;
}//尾插法,类似头插
public void addLast(int data) {Node newNode = new Node(data);if (this.head == null) {this.head = newNode;this.tail = this.head;}else{this.tail.next = newNode;newNode.prev = this.tail;this.tail = newNode;}size++;
}//辅助方法,寻找下标为index的节点
private Node getNode(int index) {Node temp = this.head;for (int i = 0; i < index; i++) {temp = temp.next;}return temp;
}//按下标插入
public void addAt(int index, int data) {Node newNode = new Node(data);//合法性判断if (index < 0 || index > size) {throw new IndexOutOfBoundsException("bad index");}if (index == 0) {this.addFirst(data);}else if(index == size){this.addLast(data);}else{Node place = getNode(index);//改链接newNode.next = place;newNode.prev = place.prev;place.prev.next = newNode;place.prev = newNode;size++;}
}
添加元素示意图:
(3)删除元素
//删除第一个元素
public void removeFirst(){if (this.head == null) return;if (this.head == tail) {this.head = null;this.tail = null;}else{this.head = this.head.next;this.head.prev = null;}size--;
}//删除最后一个元素
public void removeLast(){if (this.tail == null) return;if (head == tail) {head = null;tail = null;} else {tail = tail.prev;tail.next = null;}size--;
}//删除第一个 data == key 的元素
public void remove(int key){Node cur = this.head;//遍历while(cur != null){//判断是否找到if(cur.data == key){if(this.head == cur){removeFirst();}else if(this.tail == cur){removeLast();}else{//改链接cur.next.prev = cur.prev;cur.prev.next = cur.next;size--;}return;}//指针遍历cur = cur.next;}
}
删除元素示意图:
(4)遍历输出
// 正向遍历打印链表
public void printForward() {Node cur = head;System.out.print("Forward: null <-> ");while (cur != null) {System.out.print(cur.data + " <-> ");cur = cur.next;}System.out.println("null");
}// 反向遍历打印链表
public void printBackward() {Node cur = tail;System.out.print("Backward: null <-> ");while (cur != null) {System.out.print(cur.data + " <-> ");cur = cur.prev;}System.out.println("null");
}
(5)其他
public int getSize() {return size;
}public boolean isEmpty() {return size == 0;
}......
3.循环链表的实现
循环链表就是把尾节点指向头结点,循环链表在实际开发中的使用频率相对较低,这里不过多描述,仅做简单介绍。
class CircularLinkedList {private Node head;private Node tail;privat static class Node {int data;Node next;Node(int data) { this.data = data; }}// 添加节点到尾部public void add(int data) {Node newNode = new Node(data);if (head == null) {head = newNode;tail = newNode;tail.next = head; // 循环指向自身} else {tail.next = newNode;tail = newNode;tail.next = head; // 新尾部指向头}}// 遍历打印public void print() {if (head == null) return;Node current = head;do {System.out.print(current.data + " -> ");current = current.next;} while (current != head); // 终止条件}......}
三.相关oj题
详情请见LeetCode
1.反转一个单链表。
206. 反转链表 - 力扣(LeetCode)
2. 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
876. 链表的中间结点 - 力扣(LeetCode)
3. 输入两个链表,找出它们的第一个公共结点。
160. 相交链表 - 力扣(LeetCode)
4. 给定一个链表,判断链表中是否有环。
141. 环形链表 - 力扣(LeetCode)
四.LinkedList的使用
请参考如下代码:
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;public class LinkedListDemo {public static void main(String[] args) {// 1. 创建LinkedListLinkedList<String> linkedList = new LinkedList<>();// 2. 添加元素linkedList.add("Apple"); // 添加到末尾linkedList.addFirst("Banana");// 添加到头部linkedList.addLast("Cherry"); // 添加到末尾(同add)linkedList.add(1, "Durian"); // 插入到指定位置System.out.println("初始化链表: " + linkedList);// 输出: [Banana, Durian, Apple, Cherry]// 3. 访问元素System.out.println("\n访问元素演示:");System.out.println("getFirst(): " + linkedList.getFirst()); // BananaSystem.out.println("getLast(): " + linkedList.getLast()); // CherrySystem.out.println("get(2): " + linkedList.get(2)); // Apple// 4. 删除元素System.out.println("\n删除操作演示:");linkedList.removeFirst(); // 删除头部linkedList.removeLast(); // 删除尾部linkedList.remove("Apple"); // 删除指定元素System.out.println("删除后: " + linkedList); // [Durian]// 5. 其他常用方法System.out.println("\n其他方法演示:");System.out.println("contains('Durian'): " + linkedList.contains("Durian")); // trueSystem.out.println("size(): " + linkedList.size()); // 1System.out.println("indexOf('Durian'): " + linkedList.indexOf("Durian")); // 0// 6. 遍历方式System.out.println("\n遍历演示:");System.out.println("1. for-each循环:");for (String fruit : linkedList) {System.out.print(fruit + " ");}System.out.println("\n\n2. 迭代器遍历:");Iterator<String> it = linkedList.iterator();while (it.hasNext()) {System.out.print(it.next() + " ");}}
}
更多方法请参考官方api文档:LinkedList (Java Platform SE 8 )
结语
链表的理解难度算是数据结构当中比较难的了,oj题更是,对于初学者来说不建议死磕。可以等熟练了做专项练习,毕竟链表也是笔试的重难点了,难题基本都有它的影子(博主本人也被这么的不轻......)。
OK,那么本博客到此结束,下篇我们讲栈和队列,它们就友好多了。
觉得有帮助不妨点个赞,我们下期见!(*´∀ ˋ*)
相关文章:
【Java】链表(LinkedList)(图文版)
本博客总结了Java当中链表的实现,以及相关方法的使用,在最后附带了一些常见链表相关处理技巧,希望对你有帮助! ps:可拷贝到IDEA上自行测试,代码全部完成测试。 一.链表概述 1.什么是链表? 链…...
审批工作流系统xFlow
WorkFlow-审批流程系统 该项目为完全开源免费项目 可用于学习或搭建初始化审批流程系统 希望有用的小伙伴记得点个免费的star gitee仓库地址 仿钉钉飞书工作审批流系统 介绍 前端技术栈: vue3 ts vite arcodesign eslint 后端技术栈:springbootspring mvc mybatis mavenmysq…...
UNION,UNION ALL 的详细用法
目录 一、基本概念 二、核心区别 三、语法使用规则 四、代码实演示 4.1 两张表字段相同,字段顺序也相同 4.2 两张表字段相同。但字段顺序不同 4.3 两张表存在相同字段,但一张表字段多,一张表字段少 一、基本概念 操作符功能描述去重处…...
Java 集合遍历过程中修改数据触发 Fail-Fast 机制 ,导致报ConcurrentModificationException异常
Java Fail-Fast 机制 Fail-Fast 机制是 Java 集合框架中的一种错误检测机制,用于在遍历集合时检测结构修改。如果在迭代器创建之后,集合被修改(例如添加或删除元素),并且这种修改不是通过迭代器自身的 remove() 方法进…...
Javascript 日期相关计算
1、获取当前日期的前一天 // 获取当前日期let today new Date();today.setDate(today.getDate() - 1);// 转换为本地日期字符串格式let yesterdayStr today.toISOString().slice(0, 10);console.log(yesterdayStr); // 例如: "2023-04-03" (格式取决于地区设置) 2…...
自动驾驶背后的数学:特征提取中的线性变换与非线性激活
在上一篇博客「自动驾驶背后的数学:从传感器数据到控制指令的函数嵌套」—— 揭秘人工智能中的线性函数、ReLU 与复合函数中,我们初步探讨了自动驾驶技术中从传感器数据到控制指令的函数嵌套流程,其中提到了特征提取模块对传感器数据进行线性…...
DNS解析查询工具
dig命令 1 常用命令 命令:dig 您的域名(示例:dig www.baidu.com) 2、根据解析记录查询,比如MX,CNAME,NS,PTR等,只需将类型加在命令后面即可。 示例:dig bai…...
【eNSP实战】(续)一个AC多个VAP的实现—将隧道转发改成直接转发
在 一个AC多个VAP的实现—CAPWAP隧道转发 此篇文章配置的基础上,将隧道转发改成直接转发 一、改成直接转发需要改动的配置 (一)将连接AP的接口改成trunk口,并允许vlan100、101、102通过 [AC1]interface GigabitEthernet 0/0/8 …...
解决远程卡在下载vscode-server的问题,一键安装脚本
vscode-server 下载与安装脚本 vscode-server一键安装脚本 简介 此脚本用于下载并安装指定提交 ID 和架构的 VS Code Server。用户可以选择不同的架构,并输入对应的 VS Code 提交 ID 来下载和安装 vscode-server。VS Code提交ID可以在VS Code界面“帮助>关于…...
【unity实战】用unity封装一个复杂全面且带不同射击模式的飞机大战射击系统
考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…...
LeetCode[42] 接雨水
动态规划 left_max[i] height[i]左侧的最高高度right_max[i] height[i]右侧的最高高度height[i]能接多少水?min(left_max[i], right_max[i])-height[i] class Solution { public:int trap(vector<int>& height) {int len height.size();vector<in…...
c++ 基础题目lambda
1. auto lambda = [](double x) { return static_cast<int>(x); }; 是 匿名函数对象 ,不可直接声明 a.可以赋值给一个与其类型兼容的 std::function 类型的对象 std::function<int(int, int)> lambda = [](int x, int y) { return x + y; }; b.使用具体的 lambda …...
RTSP/Onvif安防视频EasyNVR平台 vs.多协议接入视频汇聚EasyCVR平台:设备分组的区别
EasyNVR安防视频云平台是旭帆科技TSINGSEE青犀旗下支持RTSP/Onvif协议接入的安防监控流媒体视频云平台。平台具备视频实时监控直播、云端录像、云存储、录像检索与回看、告警等视频能力,能对接入的视频流进行处理与多端分发,包括RTSP、RTMP、HTTP-FLV、W…...
网络编程套接字【端口号/TCPUDP/网络字节序/socket编程接口/UDPTCP网络实验】
网络编程套接字 0. 前言1. 认识端口号2. 认识TCP和UDP协议3. 网络字节序4. socket编程接口5. 实现一个简单的UDP网络程序5.1 需求分析5.2 头文件准备5.3 服务器端设计5.4 客户端设计5.5 本地测试5.6 跨网络测试5.7 UDP小应用——客户端输入命令,服务器端执行 6. 地址…...
【C语言预编译处理精选题】
C语言预编译处理精选题 一、选择易错题1.1 纯文本替换,注意优先级!1.2 再来一道文本替换,别马虎1.3 宏定义的替换1.4带参数宏定义的空格问题1.5 " "的include1.6 条件编译1.7 预编译概念 二、填空易错题2.1 注意两个连续的 i2.2 异…...
云钥科技工业相机定制服务,助力企业实现智能智造
在工业自动化、智能制造和机器视觉快速发展的今天,工业相机作为核心感知设备,其性能直接决定了检测精度、生产效率和产品质量。然而,标准化工业相机往往难以满足复杂多样的应用场景需求,工业相机定制逐渐成为企业突破技术瓶颈…...
用了Cline和华为云的大模型,再也回不去了
这两年AI火热,受影响最大的还是程序员群体,因为编程语言是高度形式化的,完全可以用BNF等形式精确地定义,不像自然语言那样,容易出现歧义。另外开源是软件界的潮流,GitHub上有海量的开源代码可供AI来训练&am…...
vs2017版本与arcgis10.1的ArcObject SDK for .NET兼容配置终结解决方案
因电脑用的arcgis10.1,之前安装的vs2010正常能使用AO和AE,安装vs2017后无法使用了,在重新按照新版本arcgis engine或者arcObject费时费力,还需要重新查找资源。 用vs2017与arc10.1的集成主要两个问题,1:安装后vs中没有…...
Java对接微信支付全过程详解
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
微软 System Center Configuration Manager(SCCM)的组件文件
微软 System Center Configuration Manager(SCCM) 或 Microsoft Endpoint Configuration Manager(MECM) 的组件文件,属于企业级设备管理工具的一部分。以下是具体说明: C:\Windows\CCM\smsswd.exe C:\Windows\CCM\tsmanager.exe smsswd.exe 和 tsmanager.exe 是 Micros…...
C语言和C++到底有什么关系?
C 读作“C 加加”,是“C Plus Plus”的简称。 顾名思义,C 就是在 C 语言的基础上增加了新特性,玩出了新花样,所以才说“Plus”,就像 Win11 和 Win10、iPhone 15 和 iPhone 15 Pro 的关系。 C 语言是 1972 年由美国贝…...
10.PE导出表
一:定位导出表 PIMAGE_NT_HEADERS->OptionalHeader->DataDirectory[0] typedef struct _IMAGE_DATA_DIRECTORY {DWORD VirtualAddress; // 导出表的RVADWORD Size; // 导出表大小(没用) } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY; 该结构的Vi…...
springBoot中不添加依赖 , 手动生成一个token ,并校验token,在统一拦截器中进行校验 (使用简单 , 但是安全性会低一点)
要在 Spring Boot 里实现接口统一拦截并校验 Token,可以借助 Spring 的拦截器机制。下面是具体的实现步骤和代码示例。 1. 创建 Token 工具类 import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgori…...
VSCode C/C++ 环境搭建指南
一、前言 Visual Studio Code(简称 VSCode)是一款轻量级且功能强大的跨平台代码编辑器,凭借丰富的插件生态和高度的可定制性,深受开发者喜爱。对于 C/C 开发者而言,在 VSCode 中搭建开发环境,能够获得灵活…...
ES6(4) Map 集合详解
1. Map 集合简介 Map 是 ES6 提供的一种新的键值对数据结构,与普通对象(Object)不同,Map 的键可以是任意类型(包括对象、函数等)。 2. 创建 Map 集合 可以使用 new Map() 创建一个 Map,并在括…...
DeepSeek私有化部署与安装浏览器插件内网穿透远程访问实战
文章目录 前言1. 本地部署OllamaDeepSeek2. Page Assist浏览器插件安装与配置3. 简单使用演示4. 远程调用大模型5. 安装内网穿透6. 配置固定公网地址 前言 最近,国产AI大模型Deepseek成了网红爆款,大家纷纷想体验它的魅力。但随着热度的攀升,…...
【设计模式】建造者模式
三、建造者模式 3.3 建造者模式 建造者(Builder) 模式也称构建器模式、构建者模式或生成器模式,同工厂模式或原型 模式一样,也是一种创建型模式。建造者模式比较复杂,不太常用,但这并不表示不需要了 解和掌握该模式。建造者模式…...
一场由 ES 分片 routing 引发的问题
一场由 ES 分片 routing 引发的问题 ES 结构 {"poroperties": {"joinType": {"type": "join","eager_global_ordinals": true,"relations": {"spu": "sku"}},"id":{"type&q…...
搭建Python量化开发环境:从零开始的完整指南
搭建Python量化开发环境:从零开始的完整指南 在量化投资领域,一个稳定且高效的开发环境是成功的关键。本文将引导你一步步搭建起自己的Python量化开发环境,确保你能够顺利开始编写和运行量化策略。 🚀量化软件开通 Ὠ…...
JavaScript日期区间计算:精准解析年月日差异
一、应用场景与功能概述 在日常的制作项目或者是练习,我们经常需要计算两个日期之间的精确时间差。本文将通过一个JavaScript日期计算函数,详细解析如何实现精准的年/月/日差异计算,并探讨实际开发中的常见问题和解决方案。 二、核心功能解…...
大数据学习(71)-三范式构成
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…...
el-table 插槽踩过的坑 :slot-scope 和#default的区别
slot-scope和#default是Vue中用于定义插槽的两种不同语法,它们在Vue 2和Vue 3中有不同的应用场景和语法规则。 slot-scope 在Vue 2.x中,slot-scope是用于声明具名插槽并获取父组件传递过来的数据的主要方式。通过slot-scope可以定义一个变量scop…...
Linux一键安装node.js【脚本】
node.js一般不用系统的apt安装,而是用nvm这个前端的应用商店安装 node.js是js环境,nvm是安装nodejs管理器。npm是nodejs里的包管理器,安装模块的,类似于python的pip 把以下代码复制保存在一个文件里 比如nano install_nodejs.sh …...
vue3:pinia安装及其使用
一、安装 Pinia 的步骤 1、安装 Pinia npm install pinia 2、在 Vue 应用中引入 Pinia 在 main.js 中引入并注册 Pinia: import { createApp } from vue; import { createPinia } from pinia; import App from ./App.vue;const app createApp(App); app…...
vue2升级Vue3--native、对inheritAttrs作用做以解释、声明的prop属性和未声明prop的属性
native取消 在 Vue 3 中,v-on 的 .native 修饰符已经被移除。在 Vue 2 中,.native 修饰符用于在组件的根元素上监听原生 DOM 事件,但在 Vue 3 中,这一行为发生了变化。 在 Vue 3 中,所有未在子组件的 emits 选项中定…...
【漫话机器学习系列】146.Softmax 激活函数(Softmax Activation Function)
Softmax 激活函数详解 1. Softmax 函数概述 Softmax 函数(Softmax Activation Function)是一种常用于多分类任务的激活函数,广泛应用于机器学习和深度学习模型,特别是在神经网络的输出层。它的主要作用是将输入的多个实数值转换…...
解决:ModuleNotFoundError: No module named ‘_sqlite3‘
报错: from _sqlite3 import * ModuleNotFoundError: No module named _sqlite3安装sqlite3支持组件: sudo apt-get install libsqlite3-dev进入之前下载的python包下,重新编译和安装Python ./configure --enable-loadable-sqlite-extensions make &a…...
C++差分风暴:区间修改终极模板
目录 🔥 差分核心价值 🌟 一维差分模板 1. 核心思想 2. 代码实现 3. 动态图示 📦 二维差分模板 1. 核心公式 2. 代码实现 3. 二维修改示意图 🚨 六大避坑指南 💡 复杂度对比 🌈 LeetCode实战 &…...
easypoi导入Excel兼容日期和字符串格式的日期和时间
问题场景 在使用easypoi导入Excel时,涉及到的常用日期会有yyyy-MM-dd HH:mm:ss、yyyy-MM-dd和HH:mm:ss,但是Excel上面的格式可不止这些,用户总会输入一些其他格式,如 如果在定义verify时用下面这种格式定义,那么总会…...
《保险科技》
自己在保险行业工作很多年,只是接触了一些数据的内容,对于保险业务的知识了解的很少,想通过这本书补充一下,但是发现这本书就是一些知识的拼接。 先将保险的历史,后讲保险的定义,然后就是吹嘘保险行业和互联…...
QT编程之HTTP服务端与客户端技术
一、HTTP 服务器实现方案 QtWebApp 集成 将QtWebApp源码的 httpserver 目录导入项目,并在 .pro 文件中添加 include ($$PWD/httpserver/httpserver.pri)。配置 WebApp.ini 文件定义服务参数(IP、端口、线程池等),通过 HttpL…...
每日一题--计算机网络
一、基础概念类问题 1. TCP 和 UDP 的区别是什么? 回答示例: TCP:面向连接、可靠传输(通过三次握手建立连接,丢包重传)、保证数据顺序(如文件传输、网页访问)。 UDP:无…...
IIS 服务器日志和性能监控
Internet Information Services (IIS) 是 Microsoft 提供的一款功能强大、灵活且可扩展的 Web 服务器,用于托管网站、服务和应用程序。IIS 支持 HTTP、HTTPS、FTP、SMTP 和更多用于提供网页的协议,因此广泛用于企业环境。 IIS 的…...
Unity学习之Shader总结(一)
一、Lesson1 1、渲染流水线 (1)应用阶段 模型->模型处理(应用阶段)–>输入结构 应用阶段主要操作:粗粒度剔除、进行渲染设置、准备基本数据、输出到几何阶段 (2)几何阶段 输入结构-&…...
java,poi,提取ppt文件中的文字内容
注意,不涉及图片处理。 先上pom依赖: <!-- 处理PPTX文件 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency><!--…...
matlab R2024b下载教程及安装教程(附安装包)
文章目录 前言一、matlab R2024b 安装包下载二、matlab R2024b安装教程 前言 为帮助大家顺利安装该版本软件,特准备matlab R2024b下载教程及安装教程,它将以简洁明了的步骤,指导你轻松完成安装,开启 MATLAB R2024 的强大功能之旅…...
设计模式之外观模式:原理、实现与应用
引言 外观模式(Facade Pattern)是一种结构型设计模式,它通过提供一个统一的接口来简化复杂系统的使用。外观模式隐藏了系统的复杂性,使得客户端可以通过一个简单的接口与系统交互。本文将深入探讨外观模式的原理、实现方式以及实…...
移远QuecPython模组中的看门狗技术:如何提升设备可靠性
概述 对蜂窝通信模组而言,看门狗(Watchdog)是一种硬件或软件的监控机制,用于监测模组的运行状态。当模组因为外界干扰或程序错误陷入死循环时,看门狗会自动触发模组重启,从而恢复模组的运行状态。 对看门…...
汽车感性负载-智能高边钳位能量计算
随着汽车电子技术的发展,新的电子电气架构下,越来越多的执行部件在车身出现,比如电磁阀、风机、水泵、油泵、雨刮继电器等常用的执行器, 它们一般都表现为感性特点。驱动这些负载的最简单和最常见的方法是将它们连接到高边侧开关(…...
Kubernetes之ETCD
ETCD 是 Kubernetes 的核心组件之一,它是一个分布式键值对存储数据库,专为高可用性和一致性设计。它在 Kubernetes 中的主要作用是存储所有集群数据,包括配置数据和状态信息。ETCD 是 Kubernetes 的“大脑”,其稳定性对整个集群至…...