自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 那些坑人的线程不安全集合!原因 + 解决方案全解析

本文分析了Java常用集合类的线程安全问题,指出ArrayList、HashMap等集合在多线程环境下存在数据错乱风险。文章揭示了线程不安全的本质原因——并发操作时缺乏锁保护,导致可见性和原子性无法保证。针对这一问题,提出了三种解决方案:优先推荐使用JUC并发集合(如CopyOnWriteArrayList、ConcurrentHashMap),其次可用Collections.synchronizedXXX()工具类包装,最后才是手动加锁。

2026-01-06 20:27:37 618

原创 吃透 Java 集合框架:单列集合与双列集合的核心原理与实战应用

本文全面解析了Java集合框架中的单列集合和双列集合。单列集合分为有序可重复的List和无序不可重复的Set,分别适用于不同场景;双列集合Map以键值对形式存储数据,支持高效查找和排序。文章通过性能测试和代码示例,对比了ArrayList与LinkedList的差异,详解了HashSet去重原理和TreeMap自定义排序方法,并介绍了集合间的转换技巧。掌握这些集合的特性、底层原理和适用场景,能帮助开发者在实际项目中做出更合理的选择,提升编码效率。

2026-01-03 17:57:17 982

原创 深度解析 Java 匿名内部类:从原理到实战,一篇吃透!

本文深入解析了Java匿名内部类的核心特性与应用场景。匿名内部类是一种没有类名的内部类,可继承父类或实现接口,常用于一次性使用场景。文章详细介绍了其语法规则、访问外部变量限制、构造方法特点等核心特性,并分析了在事件监听、线程创建、回调实现和集合排序中的典型应用。同时对比了匿名内部类的优缺点,指出其在简化代码结构的同时也存在调试困难等问题。最后介绍了Java8+中Lambda表达式对部分匿名内部类的替代方案,并通过实战案例展示了匿名内部类的具体应用。

2025-12-31 17:13:25 1200

原创 【吃透 Java】一文搞懂动态代理,从原理到实战,再也不怕被问懵! 前言

本文深入讲解Java动态代理技术,首先通过租房中介和明星经纪人的生活案例引入代理模式的核心思想,指出其解耦、增强和复用三大价值。随后以静态代理实现业务日志功能为例,分析其代码冗余、扩展性差等痛点,引出动态代理的必要性。重点剖析JDK动态代理的实现原理,包括InvocationHandler接口和Proxy类的核心API,并通过完整代码示例展示如何在不修改源码的情况下实现方法增强。文章还简要介绍了Cglib动态代理作为补充方案,为后续技术选型提供参考。

2025-12-29 15:45:46 2217

原创 注解入门到实战:从 “代码标签“ 到框架核心,这篇讲透了

本文系统讲解了Java注解的核心概念和应用场景。首先区分了注解与注释的本质区别,指出注解是"描述代码的数据"(元数据),能被编译器或框架解析执行。接着将注解分为三类:JDK内置注解(如@Override)、元注解(定义注解行为的规则)和自定义注解(业务扩展)。重点阐述了注解在框架配置、代码简化、编译检查、数据处理等四大场景的应用,并通过实现一个自定义日志注解演示了定义、解析和使用流程。最后给出最佳实践建议,强调注解作为"可执行的元数据"如何提升开发效率和代码质量。

2025-12-27 19:28:15 1011

原创 一文吃透 Java 反射:从原理到实战,解密框架背后的 “动态魔法“

本文深入讲解了Java反射机制的核心原理与应用。反射允许程序在运行时动态获取类信息并操作其成员,突破了静态语言的限制,是Spring等主流框架实现灵活性的关键技术。文章通过生活类比阐释反射本质,详细介绍了4类核心操作能力:探知类结构、动态创建对象、调用方法和修改属性。实战部分演示了获取Class对象的3种方式,并通过案例展示字段、方法和构造器的操作技巧。同时指出反射在框架开发、动态代理和插件化中的关键应用场景,并强调性能优化、安全性和可维护性等注意事项。

2025-12-24 12:41:32 798

原创 吃透 Java 泛型:从原理到实战,告别类型转换的烦恼

本文深入探讨了Java泛型的核心概念与应用。泛型作为JDK5引入的参数化类型特性,解决了类型安全、代码冗余等问题。文章从泛型定义入手,对比了非泛型集合的缺陷,展示了泛型在类型检查和代码简洁性上的优势。重点解析了泛型类/接口、泛型方法和通配符三大语法:通过GenericContainer示例演示泛型类实现;以printArray方法说明泛型方法的定义;详细介绍了无界通配符<?>、上界<? extends T>和下界<? super T>通配符的使用场景与限制。

2025-12-22 21:39:53 1097

原创 吃透 String、StringBuffer 和 StringBuilder 的区别,面试笔试不再踩坑

本文对比了Java中String、StringBuffer和StringBuilder的核心区别。String是不可变类,每次修改都会创建新对象,性能较差;StringBuffer和StringBuilder是可变类,直接修改原对象。StringBuffer线程安全但性能较低,StringBuilder非线程安全但性能最优。开发中单线程推荐StringBuilder,多线程用StringBuffer,字符串常量用String。文章还提供了性能测试数据和使用场景建议,帮助开发者正确选择字符串处理方式。

2025-12-18 13:29:23 597

原创 hashCode 与 equals:面试官必问的核心关联,一篇讲透

本文深入解析了Java中hashCode与equals方法的关系及其重要性。hashCode用于生成对象哈希码,提升哈希集合查找效率;equals判断对象逻辑相等。两者必须协同工作:重写equals时必须重写hashCode,以确保相等对象具有相同哈希码。否则会导致哈希集合(如HashMap、HashSet)出现逻辑错误,破坏元素唯一性。文章通过反例演示了违背这一原则的后果,并给出了正确实现方法。

2025-12-14 16:48:06 983

原创 Java 深拷贝与浅拷贝,一篇吃透所有坑!

Java深拷贝与浅拷贝的区别与实现 摘要:本文详细讲解了Java中深拷贝与浅拷贝的核心区别及实现方式。浅拷贝只复制对象的第一层属性,引用类型成员变量仍共享同一对象;而深拷贝会递归复制所有层级,创建完全独立的新对象。文章介绍了两种实现方式:通过Cloneable接口实现浅拷贝/深拷贝,以及推荐使用序列化方式实现深拷贝。关键点在于理解引用类型变量的存储方式,避免因浅拷贝导致的对象修改污染问题。实际开发中应根据需求选择合适的拷贝方式,确保数据安全性。

2025-12-11 11:11:09 882

原创 接口、普通类与抽象类:一文理清 Java 中的 “类族三剑客”

本文深入解析Java中接口、普通类和抽象类的区别与联系。普通类是功能完备的实体,可直接实例化;抽象类是半抽象的模板,通过继承强制子类实现核心逻辑;接口是纯抽象的行为规范,支持多实现扩展功能。三者差异体现在关键字、实例化、方法类型、继承方式等方面,但都遵循面向对象封装、多态等特性。实际开发应根据需求选择:具体功能用普通类,模板复用选抽象类,行为扩展用接口,也可组合使用。理解三者本质差异有助于编写更具扩展性的代码。

2025-12-10 12:32:58 1186

原创 吃透面向对象三大特征!从原理到实战,新手也能轻松拿捏

本文介绍了面向对象编程的三大核心特征:封装、继承和多态。封装通过隐藏内部实现细节并提供公共接口来确保数据安全和降低耦合;继承实现代码复用和类层级关系,子类可扩展父类功能;多态则通过继承和方法重写实现同一行为的不同表现形式,提高代码灵活性。文章结合Java实例展示了三大特性的实际应用,帮助开发者深入理解并灵活运用这些面向对象编程的基础概念。

2025-12-08 21:25:36 582

原创 吃透 Java 核心:重载与重写的区别,一篇文章讲清楚

本文详细解析了Java中重载(Overload)和重写(Override)的核心区别。重载是在同一类中定义方法名相同但参数列表不同的方法,实现编译时多态;重写是子类对父类方法的重新实现,要求方法签名完全一致,实现运行时多态。文章通过对比表格展示二者在定义范围、方法签名、多态类型等维度的差异,并指出常见误区(如仅返回值不同不算重载、static方法不能被重写)。最后列举了工具类灵活调用和框架扩展机制等典型应用场景,帮助开发者深入理解这一基础但核心的Java特性。

2025-12-06 17:26:48 1290

原创 面试官最爱问的成员变量与局部变量区别,一篇讲透!

本文详细解析了Java中成员变量与局部变量的核心区别,从定义位置、作用域、默认值、内存位置和生命周期5个维度进行对比。成员变量定义在类内方法外,具有默认值,存储在堆或方法区,生命周期较长;而局部变量定义在方法或代码块内,无默认值,存储在栈内存,生命周期短暂。文章还通过变量遮蔽和作用域混淆等实际案例展示了常见错误场景,并提供了清晰的对比表格和面试回答技巧,帮助开发者深入理解并避免相关陷阱。掌握这些区别对Java学习和面试至关重要。

2025-12-05 21:38:49 946

原创 Java 包装类型缓存机制:从源码到坑避,这篇讲透了

摘要:本文深入解析Java包装类型的缓存机制,重点分析Integer等包装类在自动装箱时的对象复用原理。通过源码剖析展示IntegerCache的实现细节,包括默认缓存范围(-128~127)和可配置特性。文章指出缓存机制带来的性能优化,同时强调开发中必须使用equals比较值而非==比较引用,避免直接new包装对象。最后总结缓存机制是Java性能优化的经典实践,合理使用能减少内存开销,但需注意规范编码避免陷阱。

2025-12-04 21:54:35 775

原创 Semaphore 有啥用?我用 3 个场景 + 源码分析

本文介绍了并发编程工具Semaphore的核心作用、实现原理及使用注意事项。Semaphore通过信号量计数器控制并发线程数量,适用于接口限流、连接池管理、生产者-消费者模型等场景。其底层基于AQS实现,通过state变量管理计数器,acquire()和release()方法分别控制信号量的获取与释放。文章特别强调要在finally块中释放信号量,区分公平锁与非公平锁的适用场景,并澄清Semaphore与Lock的区别。

2025-12-03 20:02:55 788

原创 吃透 AQS:Java 并发编程的底层基石与实战解析

本文深入解析 Java 并发编程核心基石 AbstractQueuedSynchronizer(AQS)的底层原理与实战应用。AQS 以 “volatile 状态变量 + FIFO 双向同步队列” 为核心架构,通过模板方法模式封装线程排队、阻塞唤醒等共性逻辑,子类仅需重写资源获取 / 释放关键方法即可实现同步器。文中详解 AQS 的状态管理、CLH 队列机制、独占 / 共享两种工作模式,剖析公平锁 / 非公平锁实现、线程中断处理等高频面试点,并通过自定义可重入锁的实战案例具象化核心逻辑。

2025-12-02 16:58:55 868

原创 从源码到实战:线程池处理任务的完整流程解析

本文深入解析Java线程池处理任务的完整流程。线程池通过核心线程、任务队列、临时线程和拒绝策略四个核心组件协同工作,采用"核心线程优先→队列缓冲→临时线程兜底→拒绝策略收尾"的处理逻辑。关键点包括:1)核心线程优先创建;2)队列满才创建临时线程;3)临时线程空闲超时销毁;4)资源耗尽时执行拒绝策略。实战中需注意避免无界队列、合理设置线程数、选择合适的拒绝策略,并监控线程池状态,以防止任务堆积和资源耗尽问题。掌握这些原理能帮助开发者优化线程池配置,提升系统并发性能和稳定性。

2025-12-01 21:34:27 826

原创 线程池任务队列全解析:类型、原理与实战选型

本文深入探讨了Java线程池任务队列的核心类型、实现原理及适用场景。主要分析了四种常见队列:无界队列LinkedBlockingQueue适用于任务稳定的短时任务处理;有界队列ArrayBlockingQueue适合资源受限的高并发场景;优先级队列PriorityBlockingQueue用于需区分任务优先级的业务;延迟队列DelayQueue支持延迟任务执行。文章结合源码和实战案例,指出各类队列的特性、优缺点及潜在风险,为开发者选择合适任务队列提供指导,强调需根据业务特点平衡吞吐量、资源消耗和任务调度需求

2025-11-30 12:19:29 918

原创 线程池四大拒绝策略深度解析:从原理到实战,避坑指南全收录

本文解析了Java线程池的四大拒绝策略及其应用场景。当线程池达到最大负载时,AbortPolicy(默认)会抛出异常,适合核心业务;CallerRunsPolicy让调用线程执行任务,适用于非关键任务;DiscardPolicy直接丢弃任务,适合无关紧要的操作;DiscardOldestPolicy则替换队列中最旧任务,适合时效性强的场景。文章通过源码分析、适用场景说明和优缺点对比,帮助开发者根据业务需求选择合适的拒绝策略,避免任务丢失或系统过载问题。

2025-11-29 21:41:51 749

原创 Java 线程池核心参数详解:从原理到实战优化

本文深入解析了Java线程池ThreadPoolExecutor的7个核心参数及其配置策略。主要内容包括:1) 核心线程数(corePoolSize)与最大线程数(maximumPoolSize)的CPU/IO密集型任务计算公式;2) 空闲线程存活时间(keepAliveTime)的优化建议;3) 任务阻塞队列(workQueue)的四种类型及适用场景;4) 线程工厂(threadFactory)的自定义实现方法;5) 四种拒绝策略的对比选择。

2025-11-28 20:59:21 995

原创 ThreadLocal 深度解析:Java 并发编程中的 “线程私有” 神器

ThreadLocal 是 Java 并发编程中实现线程私有变量的核心工具类,凭借无锁隔离设计,为每个线程分配独立资源副本,彻底规避多线程共享资源的并发冲突,在业务开发与框架底层应用广泛。本文先明确其核心价值,介绍线程上下文存储、避免参数传递冗余等典型场景,以及在 Spring 事务、MyBatis 会话管理中的框架应用;再深入剖析 Thread、ThreadLocal、ThreadLocalMap 的底层关联,拆解核心方法原理与关键设计细节;最后针对内存泄漏、线程池数据污染等常见问题提供避坑指南。

2025-11-27 21:49:40 737

原创 深入理解 ReentrantLock:从原理到实战,解决并发编程核心痛点

ReentrantLock是Java并发编程中比synchronized更灵活的锁机制,解决了synchronized的三大局限:不可中断、无超时机制和单一条件等待。其核心原理基于AQS框架,通过state状态和CLH队列实现锁的获取与释放。ReentrantLock支持可中断锁、超时锁和多条件等待等特性,适用于复杂并发场景。文中通过三个实战示例展示了其典型应用:可中断锁避免永久阻塞、超时锁防止死等、多条件条件实现精准线程唤醒。

2025-11-26 21:14:07 1007

原创 面试官:你说懂 synchronized?那聊聊它从代码到 JVM 的 3 层秘密

本文针对 Java 开发者常被问到的 synchronized 问题,从实战代码到 JVM 底层,拆解其 3 种核心用法(修饰普通方法、静态方法、代码块),并结合示例代码讲清 “锁对象” 的选择逻辑;深入解析 Mark Word 与 Monitor 的协作机制,用通俗比喻讲透偏向锁→轻量级锁→重量级锁的单向升级流程;最后总结 90% 开发者会踩的 3 个坑(临时变量锁、字符串常量池锁、锁对象被修改),帮助读者从 “会用” 进阶到 “懂原理”,轻松应对面试与实际开发中的并发问题。

2025-11-25 16:05:44 650

原创 如何实现乐观锁?

本文聚焦乐观锁的实现与实践,先通过对比悲观锁,明确乐观锁 “先做事再验锁” 的核心逻辑;接着详细拆解两大主流实现方案 —— 数据库层的版本号机制(附 Java+MyBatis 完整代码)与代码层的 CAS 算法(含 AtomicInteger 及自定义实现);随后针对 ABA 问题、重试性能下降等关键坑点,给出具体解决方案;最后用对比表清晰划分两种方案的适用场景,帮助开发者根据业务需求选择最优实现,彻底掌握乐观锁在并发场景中的应用。

2025-11-24 21:43:41 1209

原创 HashSet、LinkedHashSet、TreeSet 到底咋选?一篇讲透三者核心差异

本文对比分析了Java中HashSet、LinkedHashSet和TreeSet的核心差异。三者的底层实现不同:HashSet基于哈希表,无序但查询快;LinkedHashSet通过双向链表保留插入顺序;TreeSet基于红黑树实现自动排序。主要区别体现在有序性、性能、去重规则和特殊能力四个方面:HashSet完全无序且性能最优,LinkedHashSet保持插入顺序,TreeSet提供排序功能但性能稍差。

2025-11-23 16:40:29 1104

原创 面试官:你说懂动态代理?那聊聊它是怎么 “偷偷” 增强代码的

动态代理是Java开发中贯穿框架底层与实际开发的核心技术,更是面试高频考点——Spring AOP的底层实现、RPC框架的远程调用、接口的无侵入增强,都离不开它的支撑。很多开发者懂静态代理却对动态代理一知半解,本文从“代理模式的核心价值”切入,先通过租房案例讲清代理本质,再用完整可运行代码搭建静态代理脚手架,随后聚焦JDK动态代理的“3个核心类”拆解实现逻辑,补充CGLIB代理的适用场景与代码示例,最后对比两种代理方式的差异并点明实战应用场景。

2025-11-22 20:55:35 930

原创 ConcurrentHashMap原理深度拆解:从锁机制到实战避坑

HashMap线程不安全还死循环?Hashtable并发性能烂到爆?别慌,ConcurrentHashMap才是Java并发编程的“救星”!本文从面试高频问题切入,带你吃透ConcurrentHashMap的核心价值——为什么它能兼顾线程安全与高并发?内容全程干货:JDK 1.7分段锁与JDK 1.8“CAS+synchronized”的锁机制演进全解析,附核心源码片段;volatile、CAS、精准锁三大安全法宝深度拆解;还有putIfAbsent原子操作、弱一致性迭代器等实战避坑指南。

2025-11-22 11:51:42 846

原创 【Spring 深度解析】一文彻底搞懂 IoC:核心原理 + 最简示例代码

本文以最通俗的方式全面解析 Spring IoC(控制反转) 的核心概念与运行机制,通过“图示 + 示例代码 + 简化 IoC 容器实现”的方式,帮助你彻底理解 Spring 为什么能自动创建对象、如何完成依赖注入以及 Bean 是如何被容器管理的。文章适合 Spring 初学者与准备面试的开发者,让你在短时间内真正掌握 IoC 的本质与实际应用。

2025-11-20 18:21:37 760

原创 Java垃圾回收器

Java垃圾回收器(GC)是JVM自动管理内存的核心机制,通过分代回收策略优化性能。新生代采用复制算法处理短期对象,老年代用标记-整理算法管理长期对象。主流GC包括单线程的Serial GC、高吞吐的Parallel GC、低延迟的CMS GC(JDK9废弃)、全能的G1 GC(JDK9+默认),以及超低延迟的ZGC和Shenandoah GC。调优需结合场景,如G1适合微服务,ZGC适合金融交易。排查GC问题需开启详细日志,关注STW时间、GC频率和内存占用。附GC日志配置模板帮助诊断问题。

2025-11-19 20:27:44 1035

原创 深入理解 Redisson 分布式锁的看门狗机制(源码解析)

本文深入解析了Redisson分布式锁的看门狗机制实现原理。当用户获取锁时未指定过期时间,Redisson会启动看门狗机制,通过scheduleExpirationRenewal方法定期(默认10秒)执行续期任务。续期过程包括检查锁状态、发送PEXPIRE命令延长锁时间,并循环调度下一次续期。释放锁时会自动清理续期任务。该机制有效解决了锁因业务执行时间长而过期释放的问题,确保分布式锁的可靠性。

2025-11-19 12:28:54 1148

原创 Bean 的生命周期:从创建到销毁的完整流程

本文详细介绍了 Spring 框架中 Bean 的生命周期,涵盖从创建到销毁的完整流程。核心分为四个阶段:实例化、初始化、使用和销毁。重点解析了初始化阶段的三类扩展方式(@PostConstruct 注解、InitializingBean 接口和 BeanPostProcessor 后置处理器)及其执行顺序,以及销毁阶段的两种资源释放方式(@PreDestroy 注解和 DisposableBean 接口)。通过代码示例展示了各阶段的具体实现,并总结了 Bean 生命周期的执行顺序和扩展建议。

2025-11-18 15:18:33 866

原创 如何保证Redis与MySQL的数据一致性

本文探讨了Redis与MySQL数据一致性问题,分析了核心矛盾及常见诱因,如操作顺序、并发竞争等。介绍了基础方案"先更库再删缓存"及其潜在问题,并提出了进阶解决方案:延迟双删通过两次删除缓存解决并发竞争问题,适用于高并发场景;分布式锁则确保缓存重建的原子性,防止缓存击穿。文章结合代码示例说明了实现细节,为不同业务场景提供了数据一致性解决方案的选择依据。

2025-11-17 21:30:00 688

原创 Java当中锁的状态:从偏向锁到重量级锁的深度解析

本文深入解析了Java锁的三种状态及其切换机制。从偏向锁、轻量级锁到重量级锁,JVM根据竞争程度动态调整锁状态以优化性能。偏向锁适用于单线程独占场景,轻量级锁通过自旋处理少量竞争,而重量级锁则应对高并发场景。

2025-11-16 13:47:53 1067

原创 JVM的内存区域:Java程序的“内存舞台”全解析

本文系统解析JVM内存区域划分及运作机制。JVM内存分为线程私有区域(程序计数器、Java虚拟机栈、本地方法栈)和线程共享区域(Java堆、方法区)。

2025-11-14 15:57:59 637

原创 对象创建的过程

摘要: 本文详细解析Java对象创建的完整流程,通过Student类示例展示从new关键字执行到对象可用的7个关键步骤: 类加载检查:确保类已加载(静态代码块仅执行一次)。 内存分配:根据对象大小在堆中划分空间(采用指针碰撞或空闲列表算法)。 默认初始化:隐式设置成员变量零值(如name=null)。 对象头设置:标记哈希码、类元信息等身份标签。 实例初始化:先执行实例初始化块,再调用构造器(如age先被初始化为18后被覆盖)。 引用赋值:将堆地址关联到栈中的引用变量。 对象可用:通过引用操作对象。

2025-11-13 14:19:17 1136

原创 通俗易懂的理解两种责任链模式

责任链模式是一种行为设计模式,允许多个对象按顺序处理请求。本文介绍了两种实现方式:手动装配链表和自动装配链表。手动方式需要显式调用appendNext()链接节点,每个节点必须显式调用next()传递请求;自动方式通过预定义的装配器自动构建链表,当节点返回非空结果时会短路执行。两种方式各有特点,手动方式更灵活但维护成本高,自动方式更简洁但定制性较低。文章以请假审批流程为例,展示了两种实现的具体代码结构。

2025-08-24 14:21:39 788

原创 通俗易懂的理解人群标签

Java实现人群标签

2025-08-22 19:54:56 970

原创 学习拼团项目的第一天

Java学习

2025-08-21 16:58:41 1359

空空如也

空空如也

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

TA关注的人

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