- 博客(15)
- 收藏
- 关注
原创 手撕题目整理(自用)
本文摘要: 二分查找:解决旋转排序数组搜索问题(力扣33题),通过判断有序区间进行二分,时间复杂度O(logn)。 集合去重:利用HashSet的addAll方法高效合并两个集合,或使用并行流处理超大集合,TreeSet实现有序去重。 字符串因子:寻找两个字符串的最小公共因子串,通过遍历因子串并按长度筛选,优先匹配最短公共串。 等级差价计算:处理产品等级排序(A-Z),利用ASCII码差值计算最高与最低等级价格差,需去重后降序输出。 动态规划:查找最长组合单词(如"dogwalker")
2025-09-21 10:02:32
382
原创 深入理解 Java 多线程(五):原子操作类与 AQS 核心解析
LongAdder的增强版,通过自定义累加函数,可实现最大值、最小值、乘积等复杂计算。代码示例 1:统计多线程最大值// 自定义累加函数:取两个值的最大值,初始值为Long.MIN_VALUE(确保第一个值能覆盖)// 5个线程各生成0~999的随机数,原子更新最大值i++) {try {System.out.println("线程" + Thread.currentThread().getId() + "生成随机数: " + randomNum);// 累加=更新最大值。
2025-09-19 09:51:33
2433
原创 搞定多线程不用愁(四)!JUC 三大辅助类 + 锁机制 + CAS 实战指南
为了解决上述问题,JUC中提供了三种常用的辅助类,通过这些辅助类可以很好的解决线程数量过多时Lock锁的频繁操作。是 Java 并发包()中的同步工具类,核心是通过计数器实现 “让一个或多个线程等待其他线程完成一系列操作后,再继续执行自身逻辑” 的效果,常用于协调多线程的执行顺序,比如主线程等待多个子线程完成任务后再汇总结果等场景。负责 “推动” 计数器递减,汇报任务完成进度;await()负责 “阻塞等待” 计数器归 0,确保线程在其他任务都完成后再执行。两者配合,依托 AQS 的state。
2025-09-17 16:01:43
951
原创 多线程并发实战手册(三):死锁破解、线程通信、ThreadLocal 事务控制全攻略
指两个或多个进程(或线程)互相等待对方所占用的资源,且都不主动释放自己已占资源,导致所有相关进程 / 线程都无法继续执行的情况。Locksupport是Java并发包(java.util.concurrent.locks)提供的一个线程阻塞原语,用于实现线程间的通信。与synchronized和Lock不同,LockSupport不依赖锁,而是通过许可证(permit)机制来阻塞和唤醒线程。
2025-09-17 10:09:43
992
原创 多线程(二):线程怎么控?锁该怎么加?拒绝策略、volatile、单例全解析
好比银行窗口,有几个窗口是正常窗口(核心线程的数量),排队的客户(阻塞队列),某天可能业务爆满,新开几个临时窗口,注意加上新开的临时窗口后窗口数量不能超过银行的总窗口数(线程池中最大线程的数量),从哪里开临时窗口(创建线程的方式)。若某个临时窗口空闲时间(空闲时间值和单位)太长则关闭,若排队的人特别多并且超出正常窗口+临时窗口+等位区则拒绝服务,让他们下次再来(执行任务过多时候的解决方案)。并且有人在等位区排队时间过长则认定他不办业务把他请出去,然后让等位区的第一个来办理业务,等位区再加一人。
2025-09-16 11:03:28
1374
原创 多线程入门三连问:从 “是什么” 到 “怎么用”,一篇打通任督二脉
创建自定义实现Runnable接口的对象创建Thread类,并把第一步创建出的实现Runnable接口的对象作为构造方法参数传入启动线程(start())
2025-09-15 16:17:57
1326
原创 第k个排列问题(自用)
说白了这个算法,就是通过先分组,然后定位的数学方法来解决问题。还是以n=3,k=3为例,确定第1位时,后面2位还有(3-1)!=2种排列,所以k=3不在这个组里,1后面跟的两个,2后面跟的两个,k=3应该在以2开头的组里,并且应该是这个组里的第一个;现在确定了第一个数字,第二位的第一个肯定是最小的那个,那第三位只能是剩下那个了。把这个分组的逻辑转换成编程语言就可以了,利用循环来做即可。
2025-09-02 19:34:08
1040
原创 并查集的习题整理(自用)
⭐️数据结构fa[] 数组:fa[i] 表示节点i的父节点初始化时:fa[i] = i(每个节点都是自己的根)🌟核心操作查找(find):找到节点的根节点,并进行路径压缩合并(union):将两个集合合并为一个集合✴️应用场景维护连通性关系动态合并集合查询两个元素是否在同一集合✴︎优化技巧路径压缩:在find时直接指向根节点按秩合并:按树的高度或大小进行合并(可选)并查集是解决连通性问题的高效数据结构,时间复杂度接近O(1)。
2025-08-29 14:40:39
416
原创 滑动窗口的习题整理(自用)
双指针:使用left和right两个指针维护窗口窗口滑动:根据条件动态调整窗口大小状态维护:在滑动过程中维护相关状态(和、长度、瑕疵度等)
2025-08-28 14:46:19
1132
原创 学完这篇掌握流(stream),大大提高你的编程效率!
在 Java 中,流(Stream) 是 Java 8 引入的一套处理集合(Collection)的高级 API,它专注于对数据进行高效的聚合操作(如筛选、排序、映射、统计等),同时支持函数式编程和链式操作,让代码更简洁、易读。使用流通常分为 3 个步骤:常见操作:从 List 创建流: 或 (并行流)流收集为 List:示例:筛选 + 排序 + 转 List ②流与 SetSet 用于处理去重场景,流操作与 Set 结合可高效去重和转换。常见操作:从 Set 创建流:流收集为 Set:(自动
2025-08-21 15:18:50
2518
原创 一篇带你玩转:正则表达式(Java)
使用圆括号()将多个字符或子表达式组合在一起,形成一个逻辑单元。例如(ab)+,表示ab这个组合可以重复一次或多次。使用(?:)表示非捕获组,它只起到分组的作用,不会捕获匹配的内容,也不会分配组号。例如(?:ab)+,与(ab)+类似,但(?:ab)+不会产生捕获组。
2025-08-12 15:14:19
2776
原创 一些排序的习题整理(自用)
使用Lambda表达式实现复杂的多级排序:先按金牌数降序,金牌相同时按银牌数降序,银牌相同时按铜牌数降序,最后按国家名称字母顺序。通过实现Comparable接口来自定义排序:先按差值排序,差值相同时按值排序。在注释中展示了使用Lambda表达式实现的自定义排序,让小写字母排在大写字母前面。使用Collections.sort()对字符串列表进行自然排序。核心特性:6.StringSort.java---利用Map键的唯一性来去重,键不区分大小写(唯一性)!排序规则:示例演示假
2025-08-07 21:00:56
941
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅