
Java基础
文章平均质量分 73
Java基础
自燃人~
向往平淡,却不甘于平凡~
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
ThreadPoolExecutor执行过程详解
ThreadPoolExecutor执行过程详解原创 2025-06-23 18:21:34 · 482 阅读 · 0 评论 -
Spring 事务种类全解(声明式 + 编程式 + 传播行为)
底层基于 AOP 实现,Spring 自动处理事务开始、提交、回滚适合大多数常规业务开发。原创 2025-06-20 15:01:14 · 323 阅读 · 0 评论 -
简单描述一下Spring的IOC与AOP
摘要:IoC(控制反转)将对象创建和依赖管理交给Spring容器,通过构造器/Setter/@Autowired注入对象,实现解耦。AOP(面向切面编程)将通用逻辑(如日志、事务)抽离为切面,动态织入目标方法,通过切点表达式和通知实现非侵入式增强。二者共同构建了Spring高内聚、低耦合的架构,IoC负责对象生命周期管理,AOP处理横切关注点,提升代码复用性和可维护性。原创 2025-06-19 18:29:37 · 213 阅读 · 0 评论 -
Executors提供了哪些线程池,他们各自的特点?
【线程池类型与特性对比】 1️⃣ CachedThreadPool:动态伸缩线程池,核心线程数0,最大线程数无限制,60秒空闲回收,适用短期异步任务,但可能因任务暴增导致OOM。 2️⃣ FixedThreadPool:固定线程数,无界队列,适合稳定负载场景,但任务堆积易引发OOM。 3️⃣ SingleThreadExecutor:单线程顺序执行,无界队列,风险与FixedThreadPool类似。原创 2025-06-19 17:52:21 · 461 阅读 · 0 评论 -
Java 修饰符:static、final、volatile 深度对比 + 示例 + 场景实战
摘要: static、final和volatile是Java中的三个重要关键字,它们分别具有不同的特性。static用于声明类级共享变量,所有实例共享;final表示变量只赋值一次,引用不可变但内容可能可变;volatile保证多线程间的可见性。组合使用时,static final常用于定义全局常量(如配置参数),static volatile适用于线程间共享状态变量(如开关标志)。在项目中,static volatile可用于灰度发布控制,volatile可确保配置更新及时生效。原创 2025-06-19 17:01:00 · 447 阅读 · 0 评论 -
String.intern() 原理的结构化整理,适合面试复述和深入理解
《String.intern()的优化实践与注意事项》 摘要:String.intern() 是 JVM 提供的字符串常量池优化方法。JDK7 后改进为直接引用堆对象,比 JDK6 的复制方式更节省内存。通过编译期常量折叠可自动优化,但运行时拼接仍需手动处理。在大数据日志处理等高频重复字符串场景中,使用 intern() 进行字符串去重可显著降低内存占用(约20%+),减少GC次数并提升吞吐量。优化要点包括:针对高重复字段使用、避免循环滥用、注意JDK版本差异。原创 2025-06-19 16:14:37 · 410 阅读 · 0 评论 -
为什么 String 类是 final 的?
Java将String设计为final类的主要原因包括:安全性与不可变特性、哈希稳定性、字符串池机制实现、线程安全性、编译器优化以及保持行为一致性。这种设计确保了String在网络地址等敏感场景的安全性,作为HashMap键的可靠性,内存高效利用,多线程环境下的安全性,性能优化以及避免继承破坏行为。典型案例展示了不可变性对Map键值可靠性的保障。这一设计综合考量了性能、安全和一致性等因素,是Java核心类库的重要设计决策。原创 2025-06-19 16:04:06 · 247 阅读 · 0 评论 -
ThreadLocal 与 TransmittableThreadLocal 在“线程池上下文传递”上最核心的差异。
ThreadLocal与TTL的核心区别在于线程池中的上下文传递能力。普通ThreadLocal无法将主线程变量传递给子线程,且不支持线程池复用场景,容易导致内存泄漏需手动清理。而TTL通过装饰器模式,在任务提交时自动复制主线程上下文到线程池线程,确保变量正确传递,但仍需try-finally清理避免残留。典型应用场景包括TraceID追踪和用户上下文传递,TTL特别适合需要跨线程池维护上下文一致性的场景。面试时可强调TTL的Executor增强机制是其实现跨线程传递的关键。原创 2025-06-19 11:44:13 · 257 阅读 · 0 评论 -
ThreadLocal 和多线程有什么区别
ThreadLocal与多线程的区别与配合使用 ThreadLocal是为解决多线程共享变量冲突而设计的线程隔离机制,每个线程拥有独立的变量副本,常用于保存用户信息、事务连接等线程私有数据。而多线程技术(Thread/Executor)主要用于实现任务并发执行,提升程序吞吐量。两者的核心区别在于:ThreadLocal不控制线程运行但保证线程安全,多线程则管理线程生命周期但需额外处理线程安全问题。原创 2025-06-19 11:42:10 · 718 阅读 · 0 评论 -
ThreadLocal / volatile / 事务上下文传递总结
《线程安全与内存泄漏排查指南》摘要: 针对ThreadLocal引发的内存泄漏问题,建议采用jmap+MAT工具分析堆内存,重点排查ThreadLocalMap中残留的Entry。关键解决方案包括:1.显式调用remove();2.使用弱引用优化;3.线程池场景需注意生命周期管理。面试常见问题解析:ThreadLocal适用于上下文传递但需防范泄漏和线程复用问题;volatile需结合CAS解决原子性;Spring事务跨线程问题可通过TransmittableThreadLocal或TCC模式解决。原创 2025-06-19 11:04:50 · 870 阅读 · 0 评论 -
JVM GC 面试答题详细说明
JVM垃圾回收优化实践 CMS垃圾回收器通过并发标记清理机制降低FullGC停顿时间,适合对延迟敏感的在线业务(如电商秒杀),但其内存碎片问题可能导致回收失败。G1作为替代方案,采用分区管理和停顿预测机制,更适应大堆内存场景。内存担保机制防止晋升失败引发的OOM,需合理配置参数避免频繁FullGC。实际业务中,通过调整堆大小、优化GC参数、切换G1及代码优化,可有效解决高并发场景下的GC问题,提升系统稳定性。监控与异步处理也是关键的优化手段。原创 2025-06-18 18:18:34 · 776 阅读 · 0 评论 -
两个有序数组合并成一个 (归并算法的合并实现,同时也是双指针方法的典型例)
摘要:归并排序采用"分治"策略,先递归拆分数组至单个元素,再通过合并有序子数组完成排序。核心操作是双指针法合并两个有序数组:比较指针元素,较小者加入结果,剩余元素直接追加。合并时间复杂度为O(m+n),整体排序复杂度O(nlogn)。示例展示了Java实现代码,包括merge函数和递归调用过程。该算法空间复杂度O(n),适用于链表和外部排序,面试需突出其稳定性和分治思想。原创 2025-06-16 18:21:01 · 773 阅读 · 0 评论 -
「时间复杂度」和「空间复杂度」
摘要:时间复杂度衡量代码执行步骤数量,与数据量n成正比,如O(n)为线性时间,O(n²)为平方时间。空间复杂度评估额外内存使用量,新建数组时为O(m+n),就地操作为O(1)。口诀:时间复杂度看步数增长,空间复杂度看内存开销。(98字)原创 2025-06-16 17:57:16 · 311 阅读 · 0 评论 -
找数组中是否有两个数之和等于目标值
解法时间复杂度空间复杂度思路暴力双循环O(n²)O(1)穷举所有组合HashSet优化O(n)O(n)边查边存,空间换时间。原创 2025-06-16 17:48:50 · 358 阅读 · 0 评论 -
什么是 UML 建模
UML建模是使用统一建模语言图形化描述软件系统结构与行为的方法。它通过类图、时序图等帮助理清系统模块关系、业务流程,促进团队沟通和设计效率。常用工具包括StarUML、ProcessOn等。在项目实践中,UML可用于抽象类关系、展示调用链路、分析用户行为等,是软件设计阶段的重要工具,既能提高开发效率,又能减少实现歧义。原创 2025-06-16 17:42:04 · 300 阅读 · 0 评论 -
拆解 CMS/G1/ZGC 三种垃圾回收器算法过程
《JVM主流垃圾收集器对比分析》摘要 CMS、G1和ZGC是JVM三大主流垃圾收集器,各有特点:1)CMS采用标记-清除算法,追求低延迟但存在内存碎片问题;2)G1通过分区回收机制平衡吞吐与延迟,是JDK9+默认收集器;3)ZGC采用染色指针等创新技术,实现全并发操作,暂停时间低于10ms,适合大内存低延迟场景。选择时需考虑应用特性:CMS适合响应敏感系统,G1适用于通用场景,ZGC则针对超低延迟需求。三者演进体现了JVM从停顿优化到全并发的发展趋势。(149字)原创 2025-06-14 10:45:25 · 877 阅读 · 0 评论 -
HashMap 在 JDK 1.7 中为什么会出现死循环
JDK1.7的HashMap在多线程扩容时存在死循环问题 摘要:JDK1.7的HashMap在多线程并发扩容时,由于使用头插法转移链表且未加锁,可能导致链表形成环形结构。具体表现为:多个线程同时进行resize操作时,对同一桶链表的节点转移顺序可能被打乱,最终形成e1→e2→e1的闭环链表,导致后续遍历时出现死循环。该问题在JDK1.8中通过改用尾插法和synchronized锁机制得以解决。原创 2025-06-12 11:48:24 · 1007 阅读 · 0 评论 -
DispatcherServlet 内部流程
SpringMVC请求处理流程解析:DispatcherServlet作为核心控制器,通过doDispatch()方法驱动完整流程。首先获取处理器链(HandlerMapping),适配器(HandlerAdapter)调用Controller方法,中间执行拦截器逻辑(preHandle/afterCompletion)。返回结果后,视图解析器(ViewResolver)处理页面或消息转换器输出JSON。整个过程涉及五大核心组件协同工作,包括请求匹配、方法调用、视图解析等环节,典型场景如返回JSP页面或JS原创 2025-06-10 18:10:22 · 595 阅读 · 0 评论 -
项目中使用到的设计模式有哪些?都应用在什么场景?策略模式的缺点是什么?
本文系统梳理了23种设计模式,分为创建型、结构型和行为型三大类。重点解析了7种高频面试设计模式(策略、单例、工厂、责任链、代理、模板方法、观察者),包含典型应用场景、生活类比和代码示例。特别分析了策略模式的4大缺点及优化方案,建议采用工厂模式+注册机制来避免策略膨胀问题。推荐面试时优先掌握策略等7种核心模式,强调"项目实践+结构解析+代码演示+生活类比"的叙述逻辑。最后提供了设计模式分类脑图,帮助建立结构化记忆体系。全文以实用为导向,聚焦面试高频考点和工程实践中的典型解决方案。原创 2025-06-09 17:52:11 · 1341 阅读 · 0 评论 -
CallerRunsPolicy 背后的核心逻辑
是一种线程池压力过大时的“自我保护限流机制”。它不会丢任务,但会强迫提交线程“慢下来”,让提交者承担执行任务的代价,以此来缓冲资源压力、防止崩溃。原创 2025-06-05 11:51:35 · 352 阅读 · 0 评论 -
线程池实战讲解,加深记忆
阶段核心线程队列容量非核心线程调用者线程(main)初始020提交任务第1~2任务220提交任务第3~4任务22(满)0提交任务第5~6任务2满2(满)提交任务第7~10任务2满满自己执行任务无界队列虽然简单,但极易造成内存溢出;有界队列虽然吞吐有限,但可控、稳定,是生产项目的首选。原创 2025-06-05 11:06:06 · 1082 阅读 · 0 评论 -
反射机制的优缺点
可以在运行时动态加载类、获取类的信息、访问/修改属性、调用方法,甚至创建对象,提升了代码的灵活性和扩展性。许多Java框架(如Spring、Hibernate)广泛使用反射来实现IOC、AOP、ORM等功能,增强了系统的解耦能力。可以实现通用框架,如Bean拷贝、对象转JSON、ORM映射等。由于反射涉及动态解析,性能相比直接调用低,频繁使用反射会影响系统性能。破坏封装性,可以访问私有成员,可能引发安全问题或导致程序逻辑混乱。原创 2025-06-03 11:28:10 · 314 阅读 · 0 评论 -
Java线程池的保护机制
Java 线程池提供了丰富的保护机制,如合理配置线程数、有界队列、拒绝策略等。结合业务特点,还可以搭配限流和降级手段,有效防止线程池过载,保障系统稳定性和高可用性。原创 2025-06-04 18:28:45 · 429 阅读 · 0 评论 -
String、StringBuffer、StringBuilder 的区别
总结来说,String适合不可变字符串场景,用于多线程下的字符串修改,而是单线程高性能字符串拼接的首选。在实际开发中应根据线程模型和性能要求合理选择,避免不必要的对象创建。原创 2025-06-03 15:47:45 · 282 阅读 · 0 评论 -
Java 线程池完整讲解
设置线程名前缀,便于日志排查和线程管理。Java 线程池执行任务时,优先使用核心线程,其次是任务队列,再扩展最大线程数,最后使用拒绝策略兜底,并始终优先复用空闲线程资源。原创 2025-06-04 18:38:23 · 616 阅读 · 0 评论