手撕快排
给你一个整数数组 nums,请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。 https://leetcode.cn/problems/sort-an-array/description/ 手撕快排 随机数+双指针 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748import java.util.Random;class Solution { private final Random random = new Random(); public int[] sortArray(int[] nums) { if (nums == null || nums.length == 0) return nums; quickSort(nums, 0, nums.length - 1); return nums; ...
线程池
线程池为什么用线程池不用线程池的痛点:每次任务来了就 new Thread(),创建 / 销毁线程开销大(涉及系统资源),且线程数不可控,大量并发会撑爆内存。 线程池的好处:复用线程、控制最大并发数、统一管理任务排队,避免频繁创建销毁。 线程池怎么使用首先最常用的是通过 Executors 工具类快速创建线程池,适合简单场景,不用手动配置复杂参数。 为什么不建议用 Executors 提供的快捷方法Executors有newFixedThreadPool、newSingleThreadExecutor、newCachedThreadPool、newScheduledThreadPool 等,问题在于它们默认的队列: newFixedThreadPool / newSingleThreadExecutor → 用的是无界队列 LinkedBlockingQueue(默认 Integer.MAX_VALUE)。任务无限堆积,可能内存耗尽 / OOM。 newCachedThreadPool → 核心线程 0,最大线程 Integer.MAX_VALUE...
ruoyi quartz
Quartz是什么Quartz 是 Java 生态里一个专门做 “定时任务” 的库 Quartz 名词 类比 它是什么 Job 活本身 你要执行的代码(比如 “去采集温湿度”) JobDetail 装活儿的盒子 盒子上写着 “这里面的活叫采集、参数是什么”,它绑定到具体的 Job Trigger 闹钟 定义了 “什么时候响”(cron 表达式,比如每 5 分钟) Scheduler 总管 把 “盒子 + 闹钟” 绑一起,然后用一个循环线程盯着所有闹钟,到点就把盒子里的活丢给线程池执行 流程: Scheduler 里有个循环线程 QuartzSchedulerThread,不停问每个 Trigger:”你的下次触发时间到了吗?” → 到了 → 把对应的 JobDetail 交给线程池 → 线程池起一个线程去跑 Job 里的 execute() 源码12345678910111213141516171819202122// 1. Job:你要干的活public class CollectJob implements Job { public...
并发
CASCAS (Compare And Swap)是一种乐观锁,它默认没有其他线程来竞争,直到真正更新数据的那一刻才去验证。 CAS 操作需要三个核心操作数: V (Value offset):内存中实际的当前值。 A (Expected value):你“认为”现在的旧值是多少。 B (New value):你想要更新成的新值。 执行逻辑: 只有当内存里的真实值 V 等于你预期的旧值 A 时,才把 V 更新为 B。如果不等于,说明在此期间有别的线程插队改了这个值,更新失败。 CAS是如何实现原子性的?要保证“先比较,再交换”的原子性。 Java 本身无法直接操作内存,但通过 Unsafe 类,可以调用 C++ 编写的 native 方法。CAS 的底层最终会映射到 CPU 的一条硬件指令 cmpxchg。因为它是硬件级别的指令,所以 CPU 会在指令级别保证这一个动作的绝对原子性,中途绝不会发生线程上下文切换。 CAS 真的无锁吗?Java API 层面是无锁(乐观锁),硬件 CPU 层面不是完全没有锁,有lock总线锁 / 缓存锁。 cmpxchg在硬件层面还是...
数组中的第K个最大元素
数组中的第K个最大元素给定整数数组 nums 和整数 k,请返回数组中第 **k** 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 (https://leetcode.cn/problems/kth-largest-element-in-an-array/) 思路: https://www.bilibili.com/video/BV1hTfBBuE4T/?spm_id_from=333.337.search-card.all.click&vd_source=499c257f0104fdb6ce035bd58aedbdf9 12345678910111213141516171819202122232425262728293031323334353637383940414243444546import java.util.ArrayList;import java.util.List;import java.util.Random;class Solution &...
