自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 收藏
  • 关注

原创 Java中的异步编程

异步(Asynchronous)指任务发起后,无需阻塞等待其完成,主线程可立即返回处理其他逻辑,结果通过回调、轮询或通知机制获取。目的是提高系统吞吐量和响应速度。

2026-05-14 14:30:28 360

原创 Spring Boot 自动配置核心注解

*Spring Boot 自动配置 =

2026-05-05 16:57:19 199

原创 最近在刷牛客:使用Spring AOP实现性能监控时

题目:4.使用Spring AOP实现性能监控时,下列哪种方式无法获取方法执行时间?A在@Around增强中通过ProceedingJoinPoint.proceed()调用前后计算时间差B在@AfterReturning增强中通过JoinPoint获取方法开始时间戳C使用@Before记录开始时间并存入ThreadLocal,在@After中计算耗时D通过实现MethodInterceptor接口在invoke方法中计算执行时间。

2026-05-05 13:38:43 43

原创 解决mysql报错:1406, Data too long for column

LOAD DATA是一把双刃剑。它锋利无比,能帮你快速切开海量数据;但它也很笨重,没有任何容错能力。如果你指望它能像 Excel 一样智能纠错,那你一定会失望。但如果你愿意花几分钟做一次数据清洗,它绝对是 MySQL 生态中最值得信赖的批量导入工具。解决mysql报错:1406, Data too long for column(多种方案)-CSDN博客。

2026-05-02 12:21:02 320

原创 Nginx配置的详解

【代码】Nginx配置的详解。

2026-04-29 16:19:20 15

原创 AQS极简版

AQS = state + 队列 + CASlock()→tryAcquire抢锁成功 → 直接执行抢锁失败 → 入队 →park阻塞unlock()→tryReleasestate - 1state == 0 → 完全释放 → 唤醒队列第一个节点可重入:同一个线程多次加锁 → state 累加队列是双向链表,保证公平排队。

2026-04-18 16:38:28 32

原创 AQS 原理极简版 + ReentrantLock 加锁 / 解锁

AQS = AbstractQueuedSynchronizer(抽象队列同步器)是 JUC 锁(ReentrantLock、Semaphore、CountDownLatch 等)的底层核心骨架。用一个state 变量表示锁状态(0 = 无锁,1 = 已加锁,>1 = 重入)用一个记录当前持有锁的线程用一个CLH 变体双向队列存放抢不到锁的线程state(状态) + 队列(等待) + CAS(抢锁) = AQSAQS 是 JUC 锁的底层框架,靠 state + 队列 + CAS 实现。

2026-04-18 16:32:06 189

原创 JUC 的 Lock 接口 + ReentrantLock 完整用法

ReentrantLock = 可重入、功能强大的锁必须 lock () + try-finally + unlock ()核心方法:lock()一直等tryLock()尝试拿定时拿可中断Condition 可以精准唤醒线程高并发、需要灵活控制 → 用 ReentrantLock。

2026-04-18 16:21:23 389

原创 DLC(Double-check Locking)与volatile的详解

DCL 通过“两次判空 + synchronized”实现高性能懒加载单例,而volatile的作用是防止对象创建过程中的指令重排序,确保返回的对象一定是完全初始化后的实例。我按“对象创建流程 → 重排序风险 → 多线程视角 → 实际后果”​ 给你彻底拆开讲。不是原子操作,在缺少 volatile 的情况下,JVM 可能将“对象初始化”和“引用赋值”重排序,导致线程在对象尚未初始化完成时拿到非 null 引用,而 volatile 通过内存屏障禁止这种重排序,从而保证线程安全。

2026-04-18 12:16:05 379

原创 wait()/ notify()详解与应用笔记

核心定位:wait()和 notify()是 Java 中用于线程间通信(IPC, Inter-Thread Communication)的基础机制,它们必须配合 synchronized使用,解决“条件等待”问题。

2026-04-18 11:35:01 188

原创 Docker的配置出现问题:docker: Get https://registry-1.docker.io/v2/: net/http: request canceled

(主要看这上面的配置,遇到拉取不到hello-world,看上面一篇,如何解决,可能现在能用的镜像源也很少吧,我试了好多,就第一篇文章里的centos镜像源能用,替换拉取环境)遇到这个问题解决了很久,重装过几次,最可靠的就是这些,记下来以免下次安装忘记。

2026-04-17 23:43:19 34

原创 登录生成 Token + 网关解析 Token + 微服务透传 userId

✅ 登录生成Token✅ 网关解析 Token → 拿 userId✅ 网关把userId 放入请求头✅ Feign 自动透传到所有微服务✅ 任何服务直接拿用户这就是标准企业级微服务登录鉴权体系。前端带 token → 网关 GlobalFilter 解析 token → 放入 user-info 请求头 → 传给微服务 → 微服务用 preHandle 接收 user-info → Feign 自动透传。

2026-04-08 21:07:25 385

原创 MyBatis-Plus 从入门到高级完整总结

Service分页:配置插件 + new Page () + selectPage逻辑删除:deleted 字段 + @TableLogic自动填充。

2026-04-08 15:48:07 398

原创 P2P 微服务项目架构完整解析

你的结构非常标准、专业、可直接用于生产按业务域拆分微服务common 统一管理公共资源职责清晰、耦合度低、易于扩展父工程:统一依赖、版本管理common:公共代码 + Feign 接口定义,所有服务依赖业务服务:独立部署、独立数据库、通过 Feign 调用调用方式:Loan → Feign → User,完全解耦。

2026-04-07 21:50:09 538

原创 微服务架构:多模块之间通信OpenFeign

Feign 可升级 Nacos。

2026-04-07 21:21:39 128

原创 SpringBoot里面的测试依赖

【代码】SpringBoot里面的测试依赖。

2026-04-06 18:39:40 25

原创 Java自定义注解创建详解

注解(Annotation)​ 是一种元数据,用来为代码提供额外信息,但本身不改变代码逻辑。@Override而自定义注解​ 就是开发者自己定义的注解类型,用于:编译期检查框架配置(如 Spring、MyBatis)运行时反射处理自动生成代码public @interface 注解名 {类型 元素名() default 默认值;注解本质上是一个接口, 注解的方法称为元素(Element)value():注解的默认属性default:默认值支持多个参数├── aop/**

2026-04-05 11:33:05 298

原创 Jackson的使用方法详解

1.先引入Maven依赖2.Java对象3.对象、Json互转。

2026-04-04 22:02:41 73

原创 idea中springboot中使用junit测试报错的解决方案

spring-boot-starter-test默认依赖Junit5(JUnit Platform + JUnit Jupiter + JUnit Vintage);使用springboot启动器创建的工程的pom中默认会带测试启动器spring-boot-starter-test;需要排除Junit5相关的依赖包:排除junit-jupiter-api,然后再加入Junit4的依赖;解决方案:换junit4。出现这样的错误,原因是。1)修改pom.xml。

2026-04-04 18:42:34 137

原创 手写java线程池(简易版)

BlockingQueue:为一个任务队列,里面存放线程池还未来得急处理的任务,采用先进先出的原则。ThreadPoolImpl:是线程池类,里面有线程数,任务队列,线程集合。手写一个简易版的java线程池有助于我们对线程池的了解。ThreadPoolTest:为一个测试类。ThreadPool:线程池接口。Worker:代表正在运行的线程。

2026-03-25 21:33:07 38

原创 字典树的创建与查找

字典树对于字符串的查找十分方便,可以很快查找字符串的前缀。

2025-03-24 18:34:05 196

原创 堆排序解释和代码

以大顶堆为例,当大顶堆创建完成后,它的堆顶元素arr[0]已经是所有元素中的最大值了,然后将它与堆的最后一个元素arr[len-1]进行交换,那么最后一个元素arr[len-1]就成为了所有元素的最大值,紧接着,再将索引为0~len-2的元素创建成大顶堆,元素arr[len-1]在正确的位置,不用再参与建堆。0~len-2元素建堆成功后,再将arr[0]与arr[len-2]交换,0~len-3的元素进行建堆。假设元素数组为arr,长度为len,

2025-03-24 14:44:26 256

原创 KMP算法

kmp算法最重要的是求最长公共前后缀,这要用到动态规划来求。

2025-03-18 20:36:19 117

原创 java: 错误: 不支持发行版本 5的解决方案

这样就配置成功了,以上是第一次配置所需要的全过程 ,下次如果创建了maven项目,就直接将project structure中的Modules中的language level配置一下就可以了,其余的就不用动了,主要是我有两个jdk版本,很容易弄混。我的jdk的版本是17,所以要在setting中和project structure中要将所有jdk的版本号配置成相同的,不能出现maven的编译和java的编译出现不同的情况。3.file->project Structure,下面画横线的都要配置。

2024-09-16 11:44:35 1326 1

原创 MySQL 服务正在启动 .MySQL 服务无法启动。服务没有报告任何错误。

出现这样的问题可能是3306端口号被别的进程占用了 ,想要解决就将这个进程给关闭掉就可以了。3.tasklist|findstr 5348 查看这个进程的相关信息(占有的端口号)1.netstat -ano 来查看所有的任务列表,所有的进程,及进程占用的端口号。4.taskkill /pid 5348 /f 用来关闭这个进程。5.net start mysql 就成功地启动了服务。2.找到了占用3306端口号的进程为5348.

2024-04-23 10:51:22 1551 1

原创 Leedcode142.环形链表

【代码】Leedcode142.环形链表。

2024-04-21 21:25:06 364 1

原创 Leedcode 160.链表相交(面试题)

思路:两个链表相交,两条链表一定分别存在某个节点,设链表1的这个节点为node1,链表2的这个节点为node2, node1==node2,也就是node1的地址(不是node1指向的地址)与node2的地址(不是node2指向的地址)相同,代表node1和node2是同一个节点,从这个结点之后,两条链表所有结点的地址都对应相同。1.循环遍历List1,List2,得到List1链表的长度为len1,得到List2链表的长度为len2;

2024-04-21 20:56:51 237 1

原创 Leedcode 19.删除链表倒数第N个结点(采用快慢指针的方法)

【代码】Leedcode 19.删除链表倒数第N个结点(采用快慢指针的方法)

2024-04-21 20:18:58 268 1

原创 Leedcode 24.两两交换链表中的结点

【代码】Leedcode 24.两两交换链表中的结点。

2024-04-21 19:54:34 371 1

原创 Leedcode 206.反转链表

方法2:递归遍历 递归的方式有些不好理解,但是只要把上面循环弄清楚了的话,也没有那么难。输入:head = [1,2,3,4,5],请你反转链表,并返回反转后的链表。输入:head = [1,2]输出:[5,4,3,2,1]输入:head = []

2024-04-20 17:14:41 172 1

原创 链表的相关操作(虚拟头节点)

【代码】链表的相关操作(虚拟头节点)

2024-04-20 16:52:06 288 1

原创 Leedcode 209.长度最小的子数组(滑动窗口)

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。输入:s = 7, nums = [2,3,1,2,4,3]解释:子数组 [4,3] 是该条件下的长度最小的子数组。

2024-04-19 19:34:54 248 1

原创 Leedcode 997.有序数组的平方(双指针的应用)

如果nums[p2]的平方==nums[p1]的平方:将nums[p2],nums[p1]都存入到result中,指针p2和指针p1同时移动,将指针p2向左移位,将指针p1向右移一位;如果nums[p1]的平方>nums[p2]的平方:将nums[p1]存入到result中,将指针p1向右移一位,解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]定义两个指针,一个指针p1指向nums的首元素,一个指针p2指向nums的最后一个元素。

2024-04-19 18:42:11 291 1

原创 移除元素的本质

解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。输入:nums = [0,1,2,2,3,0,4,2], val = 2。输入:nums = [3,2,2,3], val = 3。

2024-04-17 23:53:07 253

原创 二分查找的书写方式

如:是while(left<=right)还是while(left<right)?是right=mid还是right=mid-1?下面来介绍二分查找的两种书写方式,通过一个简单的列子来演示一下代码。方法1:while(left<=right) ... right=mid-1 形式。输入: nums = [-1,0,3,5,9,12], target = 9。输入: nums = [-1,0,3,5,9,12], target = 2。,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的。

2024-04-17 23:22:30 293

原创 循环队列和其应用

输入:1 2 3 4 5。输出:1 2 3 4 5。

2024-04-15 15:15:18 332 1

原创 正整数的四则运算,通过栈Stack来实现

【代码】正整数的四则运算,通过栈Stack来实现。

2024-04-15 12:33:19 227 1

原创 java中io流的总结和使用

但两个大于127的字符连在一起时,就表示一个汉字,这样大约可以组合了包含7000多个简体汉字,此外数学符号、罗马希腊的字母、日文的假名们都编进去了,连在ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了。缓冲流可以加快文件的读取和写入速度,缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。,是Reader的子类,是从字节流到字符流的桥梁。

2024-04-11 13:43:11 1395 1

原创 io流的输入输出时出现中文乱码的原因

采用不同的编码方式,得到的二进制也会不同,例如:GBK编码方式中,一个中文是两个字节,而UTF-8编码方式,一个中文是用三个字节进行保存,“我们“这个中文采取这两种不同的编码格式,得到的二进制也会不同,所以用一个编码格式编码,也要用同一种编码格式解码。假如文件保存时编码格式是GBK,文件在硬盘上为GBK形式的二进制编码方式,但是在读取这段二进制以UTF-8的形式读取,它就会按照UTF-8的形式将这个二进制解析出来,结果就会出错,出现乱码的形式。如果文件过大,创建的字节数组也会过大,可能引起内存溢出。

2024-04-08 16:49:06 1889

原创 java中的Math类的常见使用

public static double pow(double a,double b) 返回a的b次幂的值。public static double ceil(double a) 向上取整 英文中的意思:天花板。public static double floor(double a) 向下取整 英文中的意思:地板。public static int max(int a,int b) 获取两个int值中的较大值。public static int abs(int a) 获取参数绝对值。

2024-04-02 10:20:08 299 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除