- 博客(43)
- 资源 (1)
- 收藏
- 关注
原创 PriorityQueue 源码深度分析(Java 8)
本文深入分析了Java 8中PriorityQueue的源码实现。PriorityQueue是基于二叉堆的无界优先级队列,默认实现为小顶堆,可通过Comparator自定义排序。文章从底层结构、核心属性入手,详细解析了其构造方法、堆化过程以及核心操作:入队时通过siftUp上浮调整堆结构,出队时通过siftDown下沉维护堆性质。关键点包括动态扩容机制、堆索引计算方式以及比较器的使用,完整呈现了PriorityQueue高效管理优先级元素的实现原理。
2025-12-10 21:10:03
841
原创 DelayQueue 源码深度分析
DelayQueue是Java并发包中基于优先级队列实现的阻塞延迟队列,其核心特性是元素必须实现Delayed接口,只有延迟时间到期后才能被取出。本文从源码层面深度分析了DelayQueue的实现原理: 类结构与成员:基于PriorityQueue存储元素,使用ReentrantLock保证线程安全,通过leader线程优化减少不必要的等待 关键方法实现: 入队操作(offer)直接插入优先级队列并唤醒等待线程 出队操作(take)采用leader-follower模式优化性能,只有leader线程会超时等
2025-12-08 22:11:55
772
原创 ArrayBlockingQueue 源码解析
ArrayBlockingQueue 是 Java 并发包中基于数组实现的有界阻塞队列,核心设计围绕「循环队列 + 独占锁(ReentrantLock) + 条件变量(Condition)」展开,确保线程安全的同时支持阻塞式、超时阻塞式及非阻塞式入队 / 出队操作。该队列具有明确特性:初始化时需指定固定容量且不可修改,遵循 FIFO 顺序,禁止插入 null 元素,数组结构带来内存连续、缓存命中率高的优势。核心组件包括存储元素的数组(items)、控制入队 / 出队位置的索引
2025-12-08 22:11:08
739
原创 ConcurrentHashMap 源码分析
本文分析了Java并发包中的ConcurrentHashMap实现,重点比较了JDK 1.7和1.8版本的设计差异。JDK 1.7采用分段锁机制,通过Segment数组将哈希表划分为多个独立区域,每个区域使用ReentrantLock保证线程安全,实现高效并发访问。JDK 1.8则改用CAS+synchronized优化,直接对桶节点加锁,进一步减小锁粒度。文章详细解读了核心数据结构、put/get方法实现原理,以及volatile变量、无锁读取等关键并发优化技术,揭示了其在保证线程安全的同时最大化并发性能
2025-12-06 21:41:08
681
原创 LinkedHashMap 源码深度分析(基于 JDK 8)
LinkedHashMap是Java集合框架中兼具哈希表高效查找和双向链表有序迭代的数据结构。它继承HashMap并维护双向链表,保留O(1)级别的增删改查性能,同时支持插入顺序和访问顺序(LRU缓存)两种模式。通过重写HashMap的钩子方法实现节点创建、访问调整和淘汰策略,其中accessOrder开关控制顺序模式,默认false(插入顺序)。核心逻辑包括:创建节点时自动加入链表尾部,访问顺序模式下将被访问节点移至尾部,以及可自定义的淘汰策略。这使得LinkedHashMap既可作为有序Map,也能实现
2025-12-06 21:40:41
588
原创 HashMap 源码深度分析(基于 JDK 8)
本文深度分析了JDK8中HashMap的实现原理。HashMap采用数组+链表+红黑树结构,通过哈希函数定位元素,使用链地址法解决冲突。JDK8在JDK7基础上优化了:1)链表长度≥8时转为红黑树;2)尾插法避免死循环;3)扩容时优化元素迁移方式。核心方法包括putVal(插入)、getNode(查询)和resize(扩容),通过扰动哈希值、动态扩容等机制保证高效性。文章还对比了JDK7/8差异,并指出HashMap非线程安全、需正确重写key的hashCode/equals方法等注意事项。
2025-12-04 20:39:13
1019
原创 CopyOnWriteArrayList 源码分析
CopyOnWriteArrayList 是 Java 并发包中的线程安全 List 实现,采用"读写分离+写时复制"机制。核心特点包括:读操作无锁且基于数组快照(保证弱一致性),写操作加独占锁并复制新数组修改后再替换原数组引用(保证线程安全)。适用于读多写少场景,避免了读写互斥但牺牲了写性能。其迭代器不会抛出 ConcurrentModificationException,体现了"无快速失败"特性。通过 volatile 数组引用和 ReentrantLock 实现
2025-12-04 20:38:55
741
原创 LinkedList 源码深度分析(基于 JDK 8)
本文深入分析了JDK8中LinkedList的源码实现。LinkedList基于双向链表结构,同时实现了List和Deque接口,兼具列表和双端队列特性。文章详细剖析了其核心设计:1)类结构与Node内部类实现;2)构造方法与元素增删改查的核心操作;3)Deque接口实现的双端队列特性;4)支持双向迭代的ListIterator实现;5)克隆与序列化机制。重点阐述了链表节点操作的高效实现,包括link/unlink系列方法,以及通过二分查找优化节点定位的node方法。最后对比了LinkedList与Arra
2025-11-29 10:45:40
1086
原创 ArrayList 源码深度分析(基于 JDK 8)
本文深度分析了JDK8中ArrayList的源码实现,主要包含以下内容:ArrayList作为动态数组实现,继承AbstractList并实现List、RandomAccess等接口,支持随机访问(O(1))和动态扩容。重点剖析了其底层数组结构、1.5倍扩容机制、三种构造方法差异,以及add/remove等核心操作的实现原理。特别解析了序列化优化(transient修饰elementData)、Fail-Fast机制和迭代器实现。最后总结了ArrayList适用于查询频繁但增删较少的场景,并指出其非线程安全
2025-11-29 10:36:04
808
原创 Java Synchronized 锁优化升级
Java Synchronized锁优化升级机制是JDK 1.6的重要改进,通过分级锁设计动态调整锁级别:从无锁→偏向锁→轻量级锁→重量级锁。该机制根据线程竞争强度自动升级,在单线程场景下使用偏向锁(零开销),轻度竞争使用轻量级锁(CAS+自旋),激烈竞争才升级为重量级锁(操作系统互斥量)。锁状态存储在对象头Mark Word中,升级过程不可逆。这种优化使Synchronized在保持线程安全的同时大幅提升性能,也是ConcurrentHashMap高效实现的关键。注意偏向锁有启动延迟,且自旋锁不适合长临界
2025-11-28 06:30:00
451
原创 Java HashMap 和 Hashtable
Java中HashMap与Hashtable的核心区别:HashMap(非线程安全)允许null键值,采用数组+链表+红黑树结构,扩容为2的幂次,效率高;Hashtable(线程安全)禁止null键值,仅用数组+链表,扩容为2n+1,效率低。多线程环境下推荐使用ConcurrentHashMap而非Hashtable。HashMap是单线程首选,Hashtable为遗留类,新项目应避免使用。主要差异体现在线程安全、null支持、数据结构和性能优化等方面。
2025-11-27 20:25:23
423
原创 Java 集合中的 fail-fast 与 fail-safe 机制详解
摘要: Java集合中的fail-fast(快速失败)和fail-safe(安全失败)是两种应对迭代时集合修改的机制。fail-fast通过modCount校验检测修改并立即抛出异常,适用于单线程环境,保证数据一致性但非线程安全。fail-safe基于写时复制策略,迭代器操作快照不抛异常,适合多线程读多写少场景,但存在数据延迟和内存开销。关键区别在于异常处理、线程安全性和数据一致性,选择需根据环境需求:fail-fast适合单线程实时操作,fail-safe适合并发安全场景。
2025-11-27 18:58:41
256
原创 Java 四大核心集合(List/Set/Queue/Map)详解
Java集合框架摘要 Java集合框架(JCF)提供了统一的数据结构操作接口,分为Collection(存储单个元素)和Map(存储键值对)两大分支。核心集合包括: List(有序可重复): ArrayList:动态数组,查询快(O1),增删慢(On) LinkedList:双向链表,增删快(O1),查询慢(On) Vector:线程安全版ArrayList CopyOnWriteArrayList:读写分离,适合读多写少 Set(无序不重复): HashSet:哈希表实现,无序 LinkedHashSet
2025-11-24 13:53:01
659
原创 Java 魔法类 Unsafe 详解
Java Unsafe类详解:底层"魔法"工具的双刃剑 Unsafe是Java中一个特殊的底层工具类,位于sun.misc包下,主要用于JDK内部库的直接内存操作、线程控制和对象操作。它能够绕过Java的安全检查机制,直接与JVM底层交互,因此被称为"魔法类"。 核心功能包括: 内存操作:分配/释放堆外内存,实现高性能IO 对象操作:直接访问私有字段、绕过构造方法实例化对象 CAS操作:支持原子性并发操作 线程控制:提供park/unpark方法替代wait/noti
2025-11-24 13:52:29
320
原创 Java 代理模式详解
Java代理模式是一种结构型设计模式,通过代理对象间接访问目标对象,在不修改原代码的情况下实现功能增强。代理模式包含三个核心角色:抽象主题、目标主题和代理主题。实现方式主要有三种: 静态代理:手动编写代理类,适用于简单场景 JDK动态代理:基于接口实现,需要目标类实现接口 CGLIB动态代理:基于继承实现,可代理无接口的类 三种方式各有优劣:静态代理简单但灵活性差;JDK代理无需手动编写但只能代理接口类;CGLIB适用范围广但依赖第三方库。代理模式广泛应用于日志记录、权限校验、事务管理等场景,Spring
2025-11-23 16:16:37
1104
原创 Java 泛型(Generic)& 通配符(Wildcard)详解
Java泛型与通配符核心要点总结 泛型本质是参数化类型,提供编译时类型安全检查和代码复用能力。主要用法包括: 泛型类/接口:类定义时声明类型参数,使用时指定具体类型 泛型方法:方法独立声明类型参数,支持静态方法 通配符解决泛型类型兼容性问题: 无界通配符?:匹配任意类型,仅读不写 上界? extends T:生产者模式,只读T及其子类 下界? super T:消费者模式,只写T及其父类 遵循PECS原则(Producer Extends, Consumer Super)选择通配符。注意Java泛型的类型擦除
2025-11-23 16:12:23
181
原创 Java NIO [非阻塞 + 多路复用解]
Java NIO是JDK 1.4引入的非阻塞I/O模型,通过通道(Channel)、缓冲区(Buffer)和选择器(Selector)三大核心组件实现高性能I/O操作。相比传统BIO,NIO具有非阻塞、多路复用等优势,适合高并发场景。缓冲区(Buffer)是数据容器,提供灵活读写控制;通道(Channel)实现双向数据传输;选择器(Selector)通过事件监听机制实现单线程管理多连接。NIO广泛应用于网络编程(如Netty)和高效文件操作,显著提升吞吐量和并发性能。
2025-11-21 21:13:09
88
原创 Java SPI(JDK 内置服务发现机制)
Java SPI(Service Provider Interface)是JDK内置的服务发现机制,通过解耦接口与实现来支持动态扩展功能。核心流程包括定义服务接口、第三方实现接口、在META-INF/services/目录下配置实现类、通过ServiceLoader加载服务。SPI具有扩展性强、标准化等优点,但也存在不支持按需加载、线程不安全等缺点。经典应用包括JDBC驱动加载、SLF4J日志绑定等。主流框架如Dubbo对SPI进行了增强,支持命名服务、依赖注入等功能。SPI是Java生态中插件化开发的重要
2025-11-21 21:12:42
1028
原创 Java String 详解
String 被声明为,且内部存储字符的数组value也是final的,这意味着:String 对象创建后,其内容(字符序列)无法被修改;任何看似 “修改” String 的操作(如拼接、替换、截取),本质都是创建新的 String 对象,原对象内容不变。字符串常量池是 JVM 为 String 设计的缓存机制,本质是一个哈希表(HashTable),存储字符串常量的引用(JDK 1.7+)或内容(JDK 1.6-)。作用:避免重复创建相同内容的字符串,减少内存占用,提高访问效率。
2025-11-20 14:29:53
547
原创 Java try-catch-finally 异常处理流程爬坑
本文深入解析Java中的try-catch-finally异常处理机制。该机制由三个核心块组成:try块执行可能出错的代码,catch块捕获并处理特定异常,finally块确保资源释放。文章分析了四种典型执行场景:正常执行、捕获异常、未捕获异常以及存在return/throw时的处理流程,强调finally块几乎总会执行(除JVM崩溃等极端情况)。同时指出了常见误区,如异常捕获过于宽泛、catch顺序不当等,并推荐使用Java7+的try-with-resources语法简化资源管理。最后总结异常处理的核心
2025-11-20 14:22:25
444
原创 【easy-captch】 简单的验证码
本文介绍了easy-captcha验证码工具的应用实践。首先说明了基础环境的搭建,包括Maven和Gradle依赖配置,以及Java8+、SpringBoot等环境的兼容性。文章重点展示了两种典型场景实现方案:1)传统Web项目通过Session存储验证码,包含验证码生成、校验逻辑和前端展示;2)前后端分离项目通过Redis存储验证码,详细说明了配置、生成、存储及校验流程。此外还介绍了进阶功能如中文验证码实现、安全性优化措施以及常见问题解决方案,为开发者提供了全面的验证码集成指导。
2025-11-18 14:00:24
354
原创 【mzt-biz-log】-「谁」在「什么时间」对「什么」做了「什么事」
mzt-biz-log是一款轻量级开源操作日志组件,通过注解实现"谁在何时对何事执行何种操作"的全链路记录。该组件适配微服务架构,支持租户隔离、条件记录和自定义存储等核心功能,适用于接口调用追踪、操作审计等场景。文章以场馆分区管理系统为例,展示了如何通过@LogRecord注解记录分区创建操作,包括操作人、分区详情及执行结果,并演示了枚举解析器实现数值到语义的转换。组件支持自定义日志存储,可灵活扩展至MySQL或ES等存储介质。其核心优势在于极简集成(仅需引入依赖和启动注解)、动态模板支
2025-11-18 09:50:49
352
原创 Java 深拷贝与浅拷贝详解
Java中的拷贝分为引用拷贝、浅拷贝和深拷贝。引用拷贝仅复制对象地址,共享同一对象;浅拷贝创建新对象,但引用类型字段仍共享原对象;深拷贝则递归复制所有字段及其引用对象,实现完全独立。浅拷贝通过Cloneable接口实现,内存效率高但存在数据共享风险;深拷贝可通过递归clone()或序列化实现,虽内存消耗大但数据隔离性强。选择拷贝方式需考虑对象结构和使用场景:简单对象或不可变引用适合浅拷贝,复杂可变对象需深拷贝确保安全。实际开发中可借助序列化或第三方库简化深拷贝实现。
2025-11-17 09:56:10
421
原创 Java BigDecimal 解决浮点精度问题
Java 浮点类型 float 和 double 由于二进制存储方式,无法精确表示部分十进制小数,导致计算时出现精度问题。BigDecimal 类通过整数和标度方式精确存储十进制数,是解决该问题的标准方案。创建时应避免使用 BigDecimal(double) 构造方法,推荐使用字符串构造或 valueOf() 方法。BigDecimal 提供完整的数学运算方法,除法运算必须指定舍入模式(如金融计算常用 HALF_UP 四舍五入)。使用时需注意其不可变性和精确计算特性,适用于金融、科学等需要高精度计算的场景
2025-11-17 09:55:51
759
原创 Java 包装类缓存机制
Java包装类缓存机制解析:数值型包装类(如Integer、Byte等)会对常用值范围(默认-128~127)预先缓存对象,以减少内存开销。不同包装类的缓存范围不同,其中Integer可通过JVM参数扩展上限。缓存触发于valueOf()方法而非构造函数,自动装箱底层也调用此方法。示例验证了缓存复用(100)与新建对象(200)的区别,并展示如何配置Integer缓存上限。
2025-11-16 15:30:00
495
原创 Java 自增自减运算符
摘要:Java中的自增(++)和自减(--)运算符用于对变量进行+1/-1操作。核心区别在于前缀(++a)和后缀(a++)的使用时机:前缀先运算后返回值,后缀先返回值后运算。单独使用时两者效果相同,但在表达式中会影响返回值结果。使用时需注意只能操作变量、不改变变量类型,并避免在复杂表达式中过度使用。多线程环境下需注意其非原子性操作特性,应使用同步机制保证线程安全。
2025-11-16 11:12:02
410
原创 Java 基础语法详解(十一)
本文系统讲解了Java基础语法的核心要点和实践应用。主要内容包括:1)集合框架与JDBC两大实用工具的关键知识点;2)通过"简易学生管理系统"项目综合运用基础语法;3)针对数据类型、面向对象、异常处理、JDBC等常见误区的解决方案;4)基础语法掌握后的进阶学习路径,包括JVM、多线程、Spring框架等方向。文章强调基础语法是Java开发的地基,需要通过"理论→实践→项目→问题排查"的学习闭环,将知识点转化为实际解决问题的能力。扎实的基础语法掌握是突破技术瓶颈、高效进
2025-11-14 14:36:40
495
原创 Java 基础语法详解(十)
本文介绍了Java数据库操作的核心技术JDBC,包括连接配置、API使用和CRUD操作实现。首先讲解了MySQL环境设置和JDBC驱动引入方法,详细说明了DriverManager、Connection等核心API的功能。重点展示了工具类封装和增删改查操作,使用PreparedStatement防止SQL注入,并通过示例代码演示了学生信息的数据库存取过程,包括参数绑定、结果集处理和资源关闭等关键步骤。内容涵盖从基础配置到完整实现,适合Java开发人员学习数据库交互技术。
2025-11-14 14:36:18
347
原创 Java 基础语法详解(九)
/ 学生实体类:封装学生信息,用注解标记需校验的属性@NotNull(message = "学生姓名不能为空") // 姓名非空校验@NotNull(message = "学生学号不能为空") // 学号非空校验@AgeRange(min = 16, max = 28, message = "学生年龄需在{min}-{max}岁之间") // 年龄范围校验// 学生状态(枚举类型)// 全参构造方法// getter/setter方法return age;
2025-11-13 08:38:49
678
原创 Java 基础语法详解(八)
Java反射机制是运行时动态获取类信息并操作对象的核心技术。通过Class类可获取类的构造方法、属性和方法,支持动态创建对象、调用方法和修改字段值。反射的核心API包括Class、Constructor、Field和Method类,常用操作有:获取Class对象(类名.class、对象.getClass()、Class.forName())、通过Constructor创建对象(支持私有构造)、使用Field操作成员变量(包括私有字段)。反射广泛应用于框架底层实现,如Spring的IoC和MyBatis的SQ
2025-11-13 08:37:29
919
原创 Java 基本语法详解(七)
Java 枚举与注解基础 本文详细介绍了Java中枚举(Enum)和注解(Annotation)的基础用法: 枚举部分: 枚举是用于定义固定常量组的特殊数据类型 核心优势包括类型安全性、可读性强和内置方法 演示了基本枚举定义和带属性/方法的增强枚举 示例展示了枚举常量、内置方法、遍历和比较等操作 注解部分: 注解是为代码添加元数据的特殊语法 主要作用包括编译器提示、框架配置、代码分析和自定义逻辑 介绍了3个核心内置注解: @Override:标记方法重写 @Deprecated:标记过时元素 @Suppre
2025-11-11 19:38:03
560
原创 Java 基本语法详解(六)
摘要: 本文介绍了Java中的IO流基础和日期时间处理。IO流分为字节流(InputStream/OutputStream)和字符流(Reader/Writer),分别用于处理二进制数据和文本数据,并提供了文件读写示例代码(如FileInputStream、FileWriter等)。Java 8的新日期时间API(java.time包)解决了旧API的缺陷,核心类包括LocalDate、LocalTime、LocalDateTime和DateTimeFormatter,支持线程安全的日期时间操作。文章通过代
2025-11-11 19:37:31
762
原创 Java 基本语法详解(五)
本文介绍了Java编程中的String类和ArrayList集合的常用操作方法。String类部分展示了length()、charAt()、equals()、contains()、indexOf()、substring()、replace()、split()和大小写转换等字符串处理功能。ArrayList部分讲解了其动态数组特性、常用CRUD操作(add/get/set/remove)以及size()、isEmpty()、contains()等方法的使用。文章通过完整代码示例演示了这些API的实际应用,包括
2025-11-10 19:27:34
555
原创 Java 基本语法详解(四)
本文详细讲解了Java面向对象三大核心特性:封装、继承和多态。封装通过私有化成员变量和提供公共访问方法实现数据保护和校验;继承使用extends关键字建立类层次结构,实现代码复用;多态则通过方法重写和父类引用指向子类对象实现动态绑定。文中提供了Student类和Person类的完整代码示例,展示了如何在实际开发中应用这些特性,包括属性校验、方法重写等关键实现细节,帮助开发者提升代码的安全性、复用性和灵活性。
2025-11-10 19:27:06
578
原创 Java 基本语法详解(三)
本文介绍了Java中的数组深入用法和面向对象基础。在数组部分,详细讲解了二维数组的定义与初始化方式(规则和不规则数组),以及Arrays工具类提供的排序、查找和填充等常见操作。面向对象部分阐述了类与对象的概念,展示了如何定义包含属性和方法的类,并通过创建Student对象实例演示了对象的实际使用方式。内容涵盖了数组高级特性和面向对象编程的核心基础,适合Java初学者掌握这些关键概念。
2025-11-08 22:30:00
677
原创 Java 基本语法详解(二)
本文详细介绍了Java中的循环结构和方法的定义与调用。主要内容包括: 循环结构: 三种循环方式:for循环(适合已知次数)、while循环(适合未知次数)和do-while循环(至少执行一次) 循环控制语句:break(跳出循环)和continue(跳过当前循环) 提供了各循环结构的语法格式和示例代码 方法: 方法的基本结构和组成部分:修饰符、返回值类型、方法名、参数列表和方法体 方法的三种分类:无参数无返回值、有参数无返回值、有参数有返回值 每种方法类型都配有完整示例代码 文章通过具体代码示例讲解了各个语
2025-11-08 18:10:35
561
原创 Java 基本语法详解(一)
本文系统介绍了Java语言的基本语法要点,主要包括三部分内容:一是Java程序的标准结构,包含包声明、导入语句、类定义和主方法;二是变量与数据类型,详细讲解了8种基本数据类型和引用数据类型的特点及用法;三是常用运算符的分类与使用规则。这些基础语法知识为后续学习Java面向对象编程打下重要基础,尤其强调变量作用域、数据类型转换和运算符优先级等关键概念的正确理解与运用。
2025-11-07 18:52:53
567
原创 JIT 与 AOT:两种关键的代码编译执行策略
JIT(即时编译)与AOT(提前编译)是代码执行的两种核心策略,主要区别在于编译时机。JIT在运行时动态编译热点代码,具有启动快、支持动态优化和跨平台的优点,适用于长生命周期程序;AOT在运行前完成全量编译,具备启动极快、运行效率高和资源占用低的优势,适合冷启动敏感场景。两者互补而非对立,现代技术趋势趋向混合方案,通过AOT预编译核心代码配合JIT动态优化,兼顾启动速度和运行效率。选择策略需匹配程序生命周期、启动要求、跨平台需求和环境资源等关键因素。
2025-11-07 18:51:33
575
原创 深入理解 Java 核心组件:JDK、JRE、JVM 与 JIT
本文深入解析Java开发与运行环境中的四大核心组件:JDK、JRE、JVM和JIT。JDK是面向开发者的完整工具包,包含JRE及编译调试工具;JRE提供Java程序运行的基础环境,包含JVM和核心类库;JVM是执行字节码的虚拟计算机,实现Java跨平台特性;JIT则是JVM中优化性能的即时编译器。文章详细阐述各组件功能、层级关系及协作流程,澄清常见误区,帮助读者构建清晰的Java技术体系认知。了解这些核心组件的定位与关联,对Java开发和运行环境配置至关重要。
2025-11-06 18:40:57
631
原创 Java 字节码(Bytecode)详解
Java 字节码详解 Java字节码是Java源代码编译后生成的中间指令集(.class文件),作为Java实现跨平台特性的核心。JVM通过解释或编译字节码为本地机器指令来执行程序。字节码具有平台无关性、安全性和动态性等优势。 字节码的生成通过javac命令完成,可使用javap工具反汇编查看其结构。.class文件包含魔数、版本号、常量池等核心结构,其中常量池存储各类引用信息。字节码指令集约200条,分为数据操作、运算、控制流、方法调用和对象操作等类型。 通过示例分析可见,JVM执行时会创建局部变量表和操
2025-11-05 18:04:41
439
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅