- 博客(47)
- 收藏
- 关注
原创 Java 主线程捕获子线程异常的三种方案
/ 1. 实现自定义 UncaughtExceptionHandler@Override// 异常处理逻辑:记录日志、清理资源等System.out.println("=== 自定义异常处理器触发 ===");System.out.println("线程名称:" + t.getName());System.out.println("异常类型:" + e.getClass().getSimpleName());
2026-03-03 00:26:38
449
原创 如何保障本地缓存数据一致性
本地缓存的一致性保障是一个“取舍问题”若业务可接受短期不一致:优先采用“失效时间 + 最终一致性”方案(最简单、最高效);若业务对实时性有一定要求:采用“主动刷新”方案(平衡实时性和性能);若业务要求强一致性:放弃本地缓存,直接使用分布式缓存或数据库。
2026-03-03 00:24:21
447
原创 ConcurrentHashMap
高并发性能:CAS 无锁 + 节点级,锁粒度极小,锁竞争概率低;高效查询:链表转红黑树,查询效率从 O(n) 提升至 O(log n);平滑扩容:多线程协助渐进式扩容,避免全表锁阻塞;内存高效:移除Segment冗余结构,仅用Node数组存储,内存开销低;fail-safe 迭代:迭代器基于哈希表快照,不抛出,支持并发修改(弱一致性)。
2026-03-02 00:47:47
354
原创 哈希表结构与存储过程
结构核心:HashMap 底层是“数组+链表/红黑树”,JDK 8 用红黑树优化长链表,提升查询效率;存储逻辑:哈希值计算 → 索引确定 → 冲突处理(空桶存元素、重复 key 覆盖值、冲突元素入链表/红黑树)→ 扩容判断;关键参数:容量(2 的幂)、加载因子(0.75)、树化阈值(8)、最小树化容量(64),共同决定哈希表的性能;适用场景:无需保证顺序、键不可重复、追求高效存取的场景(如缓存、配置存储)。
2026-03-02 00:45:30
376
原创 Redis二级缓存工具类
是一款结合本地缓存(Guava)和分布式缓存(Redis)的二级缓存工具类,专为列表类型数据设计并支持泛型。其核心目标是通过多级缓存协同,平衡数据访问性能与分布式一致性,减少数据库压力,提升系统响应速度。适用于读多写少的列表数据场景(如商品列表、用户订单历史、权限菜单等)。
2026-03-01 00:55:24
373
原创 MinioUtil工具类
MinioUtil是基于 MinIO Java SDK 封装的工具类,提供了对象存储服务的核心操作接口,支持存储桶管理、文件上传/下载/删除、权限查询、文件复制等功能。通过 Spring 依赖注入实现实例管理,简化了在 Spring Boot 项目中集成 MinIO 的流程,适合前后端分离架构中的文件存储场景(如用户头像、文档、图片等)。
2026-03-01 00:54:09
485
原创 基于Curator实现分布式锁
可重入互斥锁(最常用):不可重入互斥锁:读写锁:多重锁:信号量易于使用:简洁的API设计,支持重入锁功能丰富:支持读写锁、信号量等多种锁类型可靠性高:完善的错误处理和重试机制性能优越:优化的锁实现,减少网络开销监控完善:详细的锁状态信息。
2026-02-28 01:21:10
448
原创 Mysql实现分布式锁
更加完整详细内容可查看【免费版Java学习笔记】和【免费版Java面试题】免费版Java学习笔记(28w字)链接:https://www.yuque.com/aoyouaoyou/sgcqr8免费版Java面试题(20w字)链接:https://www.yuque.com/aoyouaoyou/wh3hto完整版Java学习笔记200w字,附有代码实现,图解清楚,仅需9.9完整版Java面试题,150w字,高频面试题,内容详细,仅需9.9完整版链接:https://www.xiaohongshu.
2026-02-28 01:20:20
1086
原创 HttpClientUtil 工具类
HttpUtil是基于 Apache HttpClient 4.5.14 封装的 HTTP 通信工具类,提供简洁易用的 HTTP 请求方法,支持 GET、POST(JSON 格式)等常见请求类型。通过连接池管理、超时控制和资源自动释放,确保高效、安全的 HTTP 通信,适用于前后端接口调用、第三方服务集成等场景。
2026-02-27 00:04:27
644
原创 Redis工具类-RedisUtil
RedisUtil是基于封装的 Redis 操作工具类,专为 Spring 项目设计(标注@Component注解)。其核心功能是通过 Spring 提供的统一管理 Redis 连接与序列化,并封装 Redis 全类型数据结构(String、List、Set、Hash、ZSet 等)及通用命令的操作方法,简化 Redis 开发流程。
2026-02-27 00:02:20
515
原创 MinIO 防重复上传
存储空间节省: 通过MD5校验避免重复文件存储性能优化: 支持大文件流式处理,避免内存溢出数据一致: 引用计数机制,确保文件生命周期管理易于扩展: 支持分布式部署和高并发场景。
2026-02-27 00:00:20
313
原创 回溯算法(Backtracking)
回溯算法是一种带“回退”的深度优先搜索枚举算法,是在问题求解的多阶段尝试过程中,从一条路径探索解,当发现当前路径不满足求解条件时,就回溯(递归返回)到上一个决策点,放弃当前路径并尝试其他可能的路径,直到找到满足要求的解或枚举完所有可能。一路向前试,走不通就回头,换条路再试,像走迷宫时遇到死胡同,退回最近的岔路口选另一个方向。代码优点:① 皇后数可自定义(通过常量配置);② 简化冲突判断逻辑;/*** 回溯算法:N皇后问题(优化版,支持自定义皇后数)
2026-02-26 23:59:09
684
原创 图的遍历(DFS+BFS)
图的遍历是指从图中任意指定顶点(初始点)出发,按照特定搜索策略沿着边访问所有顶点且每个顶点仅访问一次的过程,遍历得到的顶点序列称为遍历序列。全访问、不重复——这是因为图存在环和多对多连接,相比二叉树(无环、一对多),遍历需增加访问标记避免重复访问,是图遍历的关键要点。图的遍历要求访问所有顶点且仅访问一次,因图有环和多对多连接,访问标记是实现的关键,分为DFS和BFS两种策略;DFS基于栈实现,是“深度优先、回溯探索”,适合判断连通性,不保证最短路径,有递归(简洁)和非递归(通用)两种实现;
2026-02-25 22:01:42
639
原创 Trie树(字典树)
Trie树也叫字典树/前缀树,是一种专门为字符串匹配设计的树形数据结构,用于解决一组字符串集合中快速查找、匹配指定字符串的问题,尤其擅长处理与公共前缀相关的字符串操作。Trie树(字典树)是专为字符串匹配设计的多叉树,理念是合并公共前缀,根节点无有效字符,路径表示完整字符串,节点结束标记区分前缀和完整串;基础实现基于字符-数组下标映射(如a-z→0-25),操作是插入和查找,插入遍历字符创建节点,查找遍历字符校验结束标记;时间复杂度:构建阶段为所有字符总长度),查询阶段。
2026-02-23 22:14:17
674
原创 BM算法(Boyer-Moore)
BM算法是的缩写,是一种极致高效的滑动式字符串匹配算法,也是工业界应用广泛的经典算法;它针对BF算法的低效、RK算法哈希设计的痛点做了针对性优化,通过智能滑动规则跳过无意义的匹配,大幅减少比对次数。BM算法是高效的滑动式字符串匹配算法,为倒序匹配+智能滑动规则,应用广泛(如文本编辑器查找功能);BM算法由坏字符规则(基础)和好后缀规则(优化)组成,滑动位数取两者的最大值,坏字符规则实现简单且适配大部分场景;坏字符规则的是ASCII散列表优化,通过散列表查找坏字符在模式串中的最后下标,滑动位数公式为。
2026-02-23 22:11:36
754
原创 堆排序-排序算法
堆排序是基于二叉堆这种完全二叉树结构设计的高效排序算法,属于选择排序的进阶实现,通过不断选取堆顶的极值元素来完成有序排列,是O(nlogn)级排序算法的典型代表之一。堆排序是基于二叉堆的高效排序算法,升序用大顶堆(堆顶为最大值),降序用小顶堆(堆顶为最小值),数组存储的完全二叉树下标从0开始;构建初始堆(从最后一个非叶子节点len/2-1向上调整)、循环交换堆顶与末尾元素+重建堆(逐步缩小堆范围);操作是下沉调整(adjustHeap)
2026-02-23 22:07:24
680
原创 排序-快速排序
快速排序和冒泡排序同属交换排序,均通过元素间的比较与交换实现排序,但快速排序是对冒泡排序的极致优化——冒泡排序每轮仅归位1个元素,而快速排序每轮能将数组拆分为两个子区间,大幅减少排序轮次。快速排序是交换排序的高效实现,思想为分治法,通过「选基准、划区间、递归治」实现排序,每轮归位1个基准并拆分数组;区间划分是步骤,有双边循环法(左右双指针)和单边循环法(单指针+边界标记)两种实现,单边循环法思路更简洁;基准元素的选择影响效率,固定选起始/末尾易导致有序数组效率退化,工程中常用随机选择或三数取中优化。
2026-02-05 21:37:48
708
原创 排序-归并排序
归并排序是基于分治思想的经典排序算法,逻辑是先分后合、分而治之:先将待排序数组递归地拆分成若干个长度为1的最小子数组(天然有序),再从最小的有序子数组开始,依次将两个相邻的有序子数组合并为一个更大的有序数组,最终合并成一个完整的有序数组。归并排序的是分治思想,遵循“先递归拆分到最小有序子数组,再从底层有序合并到完整数组”的逻辑;分解(二分拆分数组)→ 解决(长度1的子数组天然有序)→ 合并(两个有序子数组合并为一个);process方法负责递归拆分,merge。
2026-02-04 21:55:42
534
原创 200w字Java学习笔记(内容详细,小白也可快速入门)
免费版Java学习笔记(28w字)链接:https://www.yuque.com/aoyouaoyou/sgcqr8。免费版Java面试题(20w字)链接:https://www.yuque.com/aoyouaoyou/wh3hto。完整版Java学习笔记200w字,附有代码实现,图解清楚,仅需9.9。完整版Java面试题,150w字,高频面试题,内容详细,仅需9.9。祝您新的一年事事马到成功,身体健康,阖家幸福,大展宏图!
2026-02-04 21:49:25
209
原创 二叉查找树(二叉排序树)
二叉查找树(Binary Search Tree,BST)也叫二叉排序树,是在普通二叉树基础上增加了节点值有序约束的特殊二叉树,通过该约束实现了高效的查找、插入操作,是二分查找思想在树形结构上的体现。二叉查找树(BST)是带值有序约束的二叉树,规则:左子树值<根节点值<右子树值,且左右子树也为BST;BST的特性是中序遍历为升序序列,这是其区分普通二叉树的关键,也是实现有序数据遍历的基础;BST的查找、插入操作逻辑一致,基于递归收缩左右子树,理想时间复杂度O(logn),极端退化为链表时O(n);
2026-02-04 21:37:13
691
原创 数据结构-哈希表
散列表(哈希表,Hash Table)是一种通过键(Key)直接映射值(Value)的数据结构,实现键值对的高效映射查询,理想情况下时间复杂度接近O(1),是开发中高频使用的非线性结构。将任意长度、任意类型的Key,通过散列算法转换为固定类型、固定长度的哈希值,再通过后续运算得到数组下标,是散列表的。由于数组长度有限,不同Key通过哈希函数计算后,得到相同的数组下标,多个键值对需要存储到同一数组位置的情况,称为哈希冲突(哈希碰撞),是散列表无法避免的问题,只能尽可能减少和解决。/**
2026-02-04 21:32:33
738
原创 数据结构-栈
栈是遵循先入后出(FILO,First In Last Out)规则的线性逻辑结构,元素仅能从一端操作,是受限的线性表。栈是FILO的受限线性逻辑结构,入栈/出栈仅能操作栈顶,操作是push、pop、peek;物理实现分顺序栈(数组)和链式栈(链表),基础版均为O(1)时间复杂度,链式栈无容量限制,顺序栈需考虑扩容;顺序栈适合容量固定、读操作频繁的场景,链式栈适合频繁增删、容量不固定的场景;栈的价值在于维护操作的顺序性,适配“后进先处理”的场景,是函数调用、表达式解析、回溯算法的基础。
2026-02-03 22:58:40
771
原创 单例模式笔记
确保一个类在整个应用生命周期中只有一个实例,且该实例能被全局访问,避免重复创建对象导致的资源浪费(如内存、CPU)。实现方式线程安全懒加载防反射防序列化适用场景饿汉式是否否否实例体积小、启动必用懒汉式(无锁)否是否否单线程测试场景懒汉式(同步方法)是是否否低并发、对性能无要求双重校验锁是是否否高并发生产环境静态内部类是是否否大多数生产环境(推荐)枚举单例是否是是高稳定性核心业务(推荐)
2026-02-03 22:57:01
780
原创 策略模式笔记
策略模式(Strategy Pattern)原始定义:定义一系列算法,将每一个算法封装起来,并使它们可以相互替换。策略模式让算法可以独立于使用它的客户端而变化。策略模式的核心是“算法封装+动态选择”,通过抽象策略接口、具体策略类、上下文类和策略工厂,消除条件判断,提高扩展性;关键设计:抽象策略定义统一接口,具体策略实现算法,策略工厂管理策略实例,上下文类持有策略并提供执行入口;经典应用:JDK的Comparator、Spring的、支付框架的支付策略,核心是“算法解耦+动态切换”;
2026-02-03 00:17:15
615
原创 56wJava笔记和面试题分享
免费版Java学习笔记(38w字)链接:https://www.yuque.com/aoyouaoyou/sgcqr8。免费版Java面试题(28w字)链接:https://www.yuque.com/aoyouaoyou/wh3hto。
2026-02-01 23:38:32
252
原创 函数模板和类模板
函数模板1 template <typename T>函数声明或定义2 利用模板实现类型参数化(1)自动推导 ——swap(a,b)(2)显示指定类型——swap<int>(a,b)3普通函数和函数模板指定类型均可以发生隐式类型转换隐式类型转换——字符类型转换为整数类型(ascll值)4 空模板参数列表——print<>(a,b)5 模板局限性时(对自定义类型),使用具体化版本,优先调用新版本函数template<> bool
2021-03-29 16:34:57
241
原创 函数模板实现选择排序
#include<iostream>using namespace std;#include<string>//选择排序template<typename T>void mysort(T arr[], int len){ for (int i = 0; i < len; i++) { int max = i; //认定最大值下标 for (int j = i + 1; j < len; j++) { if (arr
2021-03-28 21:24:22
865
原创 c++基础知识详解(上)
这里写目录标题内存模型程序运行前:代码区和全局区程序运行后:栈区和堆区new引用引用的基本语法引用做函数参数引用做函数的返回值引用的本质常量引用函数提高函数默认参数占位参数内存模型程序运行前:代码区和全局区代码区:存放CPU执行的命令代码区是共享的,是只读的全局区:全局变量,静态变量static,常量(字符串常量和const修饰的全局常量)。该区域的数据结束后由操作系统释放程序运行后:栈区和堆区栈区:由编译器自动分配和释放,存放函数的参数和局部变量注意:不要返回局部变量的地址,因为栈区
2021-03-23 19:15:08
1956
1
原创 c语言练习题(全做对必是大佬)
一输出j的值#include<stdio.h>int main(){ unsigned char i=7; int j=0; for(;i>0;i-=3) { ++j; } printf("%d\n",j);; return 0; } 答案:j的值为173解析:i的类型是无符号的字符类型,其值的范围为0~255,j的值是for循环的次数,i的值变化为 7 4 1 254…5 2 255…6 3i的值为1时再
2021-03-21 18:33:00
807
原创 程序环境和预处理
文章目录翻译环境编译环境和链接预编译 编译 汇编链接运行环境预定义符号预处理指令 以#开头#define翻译环境1.当我们写代码生成test.c源文件时,电脑会经过翻译环境生成可执行的test.exe的可执行文件,继而通过运行环境开始运行2.翻译环境分为编译环境和链接编译环境和链接1.每个源文件单独经过编译器处理,生成xxxx.obj的目标文件2.所有目标文件经过链接器链接生成可执行文件,同时链接链接库预编译 编译 汇编1 编译又分为预编译,编译,汇编2 预编译的功能——文本操作,预处理指
2021-03-19 23:02:49
156
原创 单链表实现图书管理系统
单链表实现的图书管理系统相比于结构体实现的管理系统,可以随时开辟新的空间,可以增加书的信息单链表的实现首先肯定还是打印单链表的常规操作,创建表头,创建节点,表头法插入,特定位置删除,打印链表struct book{ char name[20]; float price; int num; //书的数量};//3 数据容器——链表struct Node{ struct book data; struct Node*next;};void printflist(s
2021-03-17 23:34:53
5846
1
原创 含表头的单链表
单链表的基本结构单元就是结构体变量,链表的意义在于将结构体通过指针的形式连接起来,即每一个结构体的指针指向下一个结构体基本元素——结构体struct Node{ int data; struct Node *next;};创建表头表示整个链表//1 创建一个表头表示整个链表struct Node *createlisthead(){ //链表的基本结构单元就是结构体变量 //结构体指针指向结构体变量 //1 赋值结构体变量的地址 //2 动态内存申请 struct Node
2021-03-16 23:42:15
633
原创 c语言实现简易图书管理系统
思路:使用两个结构体,第一个结构体含有书籍的信息,第二个结构体含记录图书信息的数组和记录当前书籍数目总数的整数struct book{ int number; char name[50]; int price;};struct lib{ struct book data[1000]; int sz;};初始化//初始化图书系统void initsys(struct lib*p){ memset(p->data, 0, sizeof(p->data)); p
2021-03-11 22:02:09
7195
9
原创 动态内存管理——malloc,free,calloc,realloc
栈区——局部变量,函数形参堆区——动态内存分配的空间 malloc ,realloc,calloc,free静态区——全局变量,静态变量mallocvoid *malloc( size_t size );size代表所要开辟空间的字节1 如果开辟成功,返回指向开辟好的指针2 如果开辟失败,则指向空指针,NULL3 返回类型为void*,malloc函数并不知道开辟空间的类型,具体类型由使用者自己决定4 malloc函数开辟空间不会初始化,空间内为随机值以开辟空间用于建立数组为例#i
2021-03-11 15:40:43
163
原创 c语言实现通讯录
通讯录包括5个功能:增加信息,打印信息,删除信息,查找信息,修改信息,我们使用结构体来创建通讯录头文件如下:#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>#define namemax 255#define sexmax 20#define telemax 30#define addrmax 50#define MA
2021-03-11 00:27:25
325
原创 内存操作函数
memcpyvoid *memcpy( void *dest, const void *src, size_t count );将内存进行拷贝,可以拷贝任意类型的数据,第一个参数为目的指针,第二个函数为原指针,第三个参数为所拷贝数据的字节大小#include<stdio.h>#include<string.h> int main(){ int a1[]={1,2,3,4,5,6}; int a2[20]={0}; memcpy(a2,a1,16); int i=
2021-03-08 18:50:36
141
原创 字符串函数和字符函数详解——strlen,strcpy,strcat,strcmp......
strlensize_t strlen( const char *string );1 字符串以 \0 作为结束标志,strlen函数返回的是 \0之前出现的字符个数2 字符串必须以 \0 结束3 返回值为 size_t ,是无符号类型strcpychar *strcpy( char *strDestination, const char *strSource );1 源字符串必须以 \0结束2 会将源字符串的 \0拷贝到源字符串3 目标空间必须足够大且是可变的书写函数模拟实现#
2021-03-08 14:27:59
514
1
原创 指针和数组题目
以64为平台为例a为数组, sizeof(a)计算的为整个数组的大小&a取出的为整个数组的地址其余情况均为首元素的地址#include<stdio.h> int main(){ int a[]={1,2,3,4}; printf("%d\n",sizeof(a)); 16 整个数组大小,单位是字节 printf("%d\n",sizeof(a+0)); 8 a+0为第一个元素的地址,地址的大小为4/8,32平台为4,64平台为8
2021-03-05 01:37:41
252
3
原创 qsort函数解析、应用及底层原理
qsort函数可以对任意类型数据排序,头文件为<stdlib.h>,其函数原型为void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );第一个元素为所要排序数据的起始数据的地址,第二个元素为数据元素个数(宽度),第三个元素为数据的字节大小,第四个为比较函数,用来进行比较对数组进行排序#include<st
2021-03-04 17:41:46
1950
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅