- 博客(35)
- 收藏
- 关注
原创 如何实现jvm中自定义加载器?
java运行/*** 基础自定义类加载器(遵循双亲委派)*/// 自定义类加载的根路径// 父加载器默认是应用类加载器(Application ClassLoader)/*** 重写findClass:实现从自定义路径加载.class文件的字节码*/@Overridetry {// 1. 将类全限定名转换为文件路径(如com.example.TestClass → com/example/TestClass.class)// 2. 读取.class文件的字节码。
2025-12-11 19:12:35
943
原创 击穿式理解“JAVA栈帧”
栈帧区域核心作用核心特点局部变量表存方法参数 / 局部变量编译期定长,Slot 为单位,无 GC操作数栈方法运算的临时区栈结构,指令驱动压栈 / 弹栈动态链接解析方法符号引用为直接引用支持多态,动态绑定方法返回地址记录方法退出后回到哪里执行正常 / 异常退出两种逻辑为单个方法的执行提供 “独立、封闭的执行上下文”,所有方法的执行逻辑(变量存储、运算、返回)都在栈帧内完成,而虚拟机栈则是这些上下文的 “容器”。
2025-12-08 19:32:35
552
原创 java中的魔数是什么意思?
代码中直接出现的、无注释说明含义的数字常量,是典型的编程反模式,会导致代码可读性差、维护成本高。用常量替代魔数,给常量起有意义的名字:java运行// 常量命名清晰,含义一目了然// 奖金比例// 法定成年年龄// 高薪阈值return 0;类型核心含义处理方式字节码魔数.class 文件开头的 0xCAFEBABE,验证合法性JVM 自动校验,开发者无需干预编程魔数硬编码的无意义数字常量用常量 / 枚举替代,提升可读性让数字有 “名字”,而非让读者猜 “含义”。
2025-12-08 19:30:43
349
原创 击穿式理解JVM结构
击穿式理解 JVM 内存结构,关键是跳出 “背定义” 的层面先抓 “线程私有 / 共享” 的核心划分(隔离 vs 共享,GC vs 无 GC);再拆每个区域的 “本质用途 + 生命周期 + 异常场景”;最后用 “对象流转” 串联所有区域,结合实战问题(OOM、GC 频繁)理解设计初衷。记住:JVM 内存结构的设计,本质是平衡 “性能”(线程隔离)、“内存利用率”(分代 GC)、“稳定性”(内存限制)—— 所有规则和异常,都围绕这三个核心。
2025-12-08 19:29:45
888
原创 初步了解Stream流
Stream 流的核心是 “数据管道化 + 声明式编程”:将数据处理逻辑拆分为一系列可组合的操作,屏蔽底层遍历和线程细节,让代码更简洁、易维护,同时支持高效的串行 / 并行处理。它是处理集合 / 序列数据的 “瑞士军刀”,尤其适合复杂数据加工场景。
2025-12-03 19:51:02
933
原创 深入理解 Stream 流(以 Java 为核心,兼顾设计思想)
Collectorsreduce(避免空流报错);;(支持并行归约)。例子:用reduce实现字符串拼接(并行安全)java运行// 并行归约:identity是初始值,accumulator是单个线程累加,combiner是线程间合并.reduce("", // 初始值(空字符串)(s1, s2) -> s1 + s2, // 单个线程:拼接两个字符串(s1, s2) -> s1 + s2 // 多线程:合并两个线程的结果// 结果:"abcd"java运行。
2025-12-03 19:49:27
753
原创 JavaConfig核心注解与实战指南
java运行// 业务类:无需任何注解,通过JavaConfig手动注册为Bean// 构造器注入(推荐)// setter注入(可选)JavaConfig 是 Spring 推荐的配置方式,核心是通过定义配置类,@Bean定义 Bean,配合@Autowired等注解实现依赖注入和组件管理。其优势在于类型安全、重构友好、代码一体化,是 Spring Boot 的核心配置基础,也是现代 Spring 开发的首选方案。编辑分享如何在Spring Boot项目中使用JavaConfig。
2025-12-01 09:03:25
976
原创 单例模式:高效实现全局唯一实例
天然线程安全:JVM 保证枚举实例的初始化是单线程的,无需手动加锁;防止反射破坏:Java 反射机制无法创建枚举类的实例(会抛出序列化安全:普通单例序列化后反序列化会创建新实例,枚举类默认重写了方法,保证反序列化后仍是原实例;实现极简:一行代码定义实例,无需处理懒加载、线程安全等细节。减少内存开销:仅创建一个实例,避免重复创建重量级对象;统一访问控制:全局唯一入口,便于维护对象状态和资源共享;避免资源冲突:如数据库连接池避免多线程并发创建过多连接导致的资源耗尽。若需懒加载 + 无复杂需求。
2025-12-01 09:02:48
1534
原创 Spring 整合 MyBatis 深度详解(原理 + 实操 + 源码级解析)
创建文件(放在目录下),编写与 Mapper 接口方法对应的 SQL 语句:xml-- namespace必须与Mapper接口全类名一致 -->-- 定义ResultMap(解决字段名与属性名不一致问题,优先级高于驼峰命名) -->-- 1. 根据ID查询用户 --></select>-- 2. 根据用户名查询用户 --></select>-- 3. 查询所有用户(分页) --></select>-- 4. 新增用户(返回自增主键) --></insert>
2025-11-28 14:03:44
1204
原创 MySQL架构初步了解
MySQL 架构采用和,核心特点是,既保证了灵活性(支持多种存储引擎),又实现了核心功能的复用(如 SQL 解析、优化)。
2025-11-27 13:49:38
356
原创 MySQL 索引常用索引与失效场景优化技巧
MySQL 索引的核心是「B + 树有序结构 + 合理字段选择」,设计时需平衡「查询性能」和「写操作开销」。基础阶段需掌握索引类型和失效场景,进阶阶段需结合 InnoDB 聚簇索引特性(如主键设计、回表优化),结合业务场景精准建索引,才能最大化发挥索引的加速作用。
2025-11-26 14:47:15
880
原创 理解Mysql核心InnoDB引擎[ 看这篇!]
InnoDB 的核心设计围绕「事务安全、高并发、低 IO架构上:通过缓冲池减少磁盘 IO,日志系统(redo/undo/binlog)保障数据一致性;存储上:聚簇索引将数据与索引结合,提升查询效率,联合索引遵循最左前缀原则;并发上:MVCC 实现读不加锁,行锁 + 间隙锁平衡并发与隔离性;优化上:核心是「最大化缓冲池利用率、避免锁冲突、减少 IO 操作」。深入理解 InnoDB 需结合实战(如通过EXPLAIN。
2025-11-26 14:26:52
1675
原创 深入悲观锁:原理、实现、场景与避坑
基于 Redis 的分布式锁(如 Redlock 算法);基于 ZooKeeper 的分布式锁(临时有序节点);本地锁(如 Java 的悲观锁的核心价值是“强一致性优先”,通过 “提前锁定” 避免并发冲突,适合高冲突、需原子性操作的业务场景。数据库层面优先使用 InnoDB 行锁(基于索引),避免表锁和锁降级;单应用用 Java 本地锁,分布式系统用 Redis 分布式锁(Redisson 简化开发);规避死锁、锁超时、索引失效等坑,合理设置锁粒度和超时时间;
2025-11-24 09:02:33
1183
原创 深入乐观锁:原理、实现、场景与避坑
乐观锁的核心价值是“非阻塞高并发”,通过 “版本校验” 实现无锁并发控制,避免了悲观锁的阻塞开销。实际开发中,优先选择数据库版本号机制(兼容性好、易维护),或用 MyBatis-Plus 插件简化开发;结合业务场景选择(高并发低冲突用乐观锁,高冲突用悲观锁);设计合理的重试机制(避免死循环);规避分布式、长事务等场景的局限性。
2025-11-24 08:56:54
1142
原创 线程、程序、进程的定义以及区别
程序(Program)静态存储在硬盘上的可执行文件或脚本(如.exe.jar或.py文件),本质是指令集合的“蓝图”。未被加载时不占用任何运行资源(CPU、内存等),仅存在于存储介质中。示例:安装目录下的QQ.exe、编译后的文件。进程(Process)程序被加载到内存后的动态运行实例,是操作系统分配资源(内存、文件句柄等)的最小单位。每个进程拥有独立的地址空间和资源,生命周期包括创建、运行、终止。示例:启动两个QQ账号会生成两个独立的QQ进程;浏览器多标签页可能对应多个进程。
2025-11-20 14:41:03
244
原创 spring框架【适用于spring新手入门】
Spring 是一个轻量级的开源 Java 开发框架,旨在简化企业级应用程序的开发。其核心特性包括依赖注入(DI)、面向切面编程(AOP)、事务管理以及模块化设计。Spring 框架提供了丰富的功能模块,如 Spring MVC、Spring Boot、Spring Data 等,适用于构建各种规模的应用程序。Spring 的核心思想是通过 IOC(控制反转)容器管理对象的生命周期和依赖关系,减少组件间的耦合,提高代码的可维护性和可测试性。
2025-11-20 14:39:58
504
原创 notify() 和 notifyAll() 的区别
notify()必须在同步代码块或同步方法中调用(持有对象监视器锁),否则抛出。唤醒仅针对调用对象的等待队列,不同对象的等待队列互不影响。例如只唤醒的线程。
2025-11-17 20:00:02
399
原创 集合的快照原理
函数式语言(如 Clojure)使用持久化数据结构(Persistent Data Structures),通过结构共享减少复制开销。当创建快照时,集合的数据会被复制一份,后续修改操作会作用于新的副本,而快照保持原始数据的引用。这种方式牺牲了部分写性能(需复制数据),但保证了读操作的线程安全性。快照的核心原理是通过。
2025-11-13 18:54:50
344
原创 HashMap线程不安全的原因
当多个线程同时向HashMap插入数据时,若两个线程计算出的键值对在同一个桶(bucket)位置,可能导致数据覆盖。
2025-11-12 13:47:09
223
原创 HashMap 的底层数据结构
当多个键的哈希值映射到同一个桶时(哈希冲突),HashMap 使用链表来存储这些键值对。在 JDK 8 及以后版本中,当链表长度超过阈值(默认为 8)且数组长度达到一定值(默认为 64)时,链表会转换为红黑树,以提高查询效率。HashMap 使用一个数组来存储元素,数组的每个位置称为一个“桶”(bucket)。通过哈希函数计算键(key)的哈希值,将键值对映射到数组的某个索引位置。红黑树在极端情况下(大量哈希冲突)将查询时间复杂度从链表的 O(n) 优化为 O(log n),但维护成本较高。
2025-11-12 13:43:46
447
原创 Maven项目的标准结构
存放项目主代码的Java源文件,包路径应符合groupId+artifactId的约定。仅对Web项目有效,存放WEB-INF、HTML、JSP等文件。Maven项目的核心配置文件,定义项目依赖、构建配置、插件等信息。单元测试代码目录,通常使用JUnit等框架。由Maven自动生成,包含编译后的类文件(标签在父POM中声明子模块,实现统一构建。)、静态资源(如XML、JSON)等。对于多模块项目,父目录会包含子模块的。)及最终构建产物(如JAR包)。测试专用的资源配置文件。
2025-11-09 23:03:17
183
原创 java三大特性,封装,继承,多态
封装的核心在于隐藏实现细节并暴露安全接口,依赖访问控制修饰符和JVM内存隔离机制。内存隔离通过堆内存存储对象变量、方法区存储类元数据实现。私有变量必须通过栈帧机制的方法调用间接访问,避免内存篡改。通过字节码分析工具可验证访问控制标记和方法表条目,这些底层实现共同支撑了面向对象的三大特性。从JVM视角看,三者通过类元数据管理、内存布局和指令逻辑协同实现高效面向对象编程。
2025-11-06 19:59:07
230
原创 异常处理的最佳实践
合理选择异常基类自定义业务异常应继承异常链式传递try {throw new ConfigurationException("无效配置文件格式", e);
2025-11-05 08:47:19
366
原创 JAVA序列化
分布式系统(如Dubbo、gRPC)通过序列化实现对象跨节点传输,将参数和返回值转为字节流进行网络通信。Java序列化是将对象转换为字节序列的过程,反序列化则是将字节序列还原为对象。游戏存档、缓存框架将对象状态序列化后存入磁盘或数据库,例如将用户会话对象保存至Redis。同一主机不同进程间传递对象时,需通过序列化突破内存隔离限制,如Android的IPC机制。一致,新增字段建议设置默认值,删除字段会导致历史数据丢失。,或在序列化前进行加密处理,避免数据泄露。标记接口,未实现该接口的类无法被序列化。
2025-11-04 08:43:35
253
原创 阻塞IO、非阻塞IO和IO复用
阻塞IO:简单易用,但并发能力弱,适合低负载应用(如本地工具)。非阻塞IO:避免长阻塞,但CPU轮询浪费资源,通常作为辅助手段(如配合IO复用处理数据复制)。IO复用:通过内核监听器实现“单进程管理多I/O”,阻塞点集中,是高并发网络编程的首选(服务器处理10万+连接)。阻塞发生在哪个阶段?进程如何等待事件?多I/O如何被管理?掌握它们,你就能在系统设计中做出最优选择,打造高效、稳定的服务。希望本文为你揭开了I/O模型的神秘面纱!欢迎在评论区分享你的实践经验或疑问。
2025-11-04 08:38:47
1517
原创 字符串反转的底层实现与线程安全分析
Java中String对象不可变,任何修改操作都会创建新对象。这种设计天然线程安全,但频繁修改会产生大量对象,影响性能。反转操作必须通过创建新对象完成。使用双指针法从两端向中间交换字符,适用于字符数组或可变字符串类型。对于不可变字符串(如Java的String),需转换为字符数组操作。StringBuilder与StringBuffer接口一致,但去除了同步锁,性能提升约10%-15%。关键字保证方法级线程安全,适合多线程环境。其内部使用字符数组存储数据,容量可动态扩展(默认扩容为原容量2倍+2)。
2025-11-01 11:45:37
416
原创 javaSring底层原理
Java使用字符串常量池(String Pool)来优化字符串内存使用。通过字面量创建的字符串会优先从常量池中查找,避免重复创建。这种改进可以减少内存占用,尤其是对于大量单字节字符(如ASCII)的字符串。由于String的不可变性,频繁拼接字符串会导致大量中间对象产生。从Java 9开始,为了优化内存使用,String的内部实现从。在Java中,String的底层实现是基于字符数组((线程安全)进行动态字符串操作。,并配合一个编码标志字段。
2025-10-30 14:03:17
156
原创 static关键字解析:底层原理、应用场景与最佳实践
static关键字通过改变存储位置和生命周期,在内存效率与状态管理间建立平衡。正确使用时能提升性能(如$$T(n)=O(1)$$的常量访问),滥用则会导致耦合性增加和内存风险。建议遵循“无状态工具优先,有状态实例隔离”的原则。
2025-10-29 15:24:27
609
原创 i++ 与 ++i 的区别
在早期编译器优化不足时,前置自增(++i)可能比后置自增(i++)效率更高,因为后置自增需要保存原始值的临时副本。但对于复杂的迭代器或自定义类型,前置自增仍可能更高效。i++ 和 ++i 都是 C 语言及其衍生语言(如 C++、Java、C#)中的自增运算符,用于将变量 i 的值增加 1,但它们在运算顺序和返回值上有区别。后置自增运算符先返回变量的当前值,然后再对变量进行自增操作。前置自增运算符先对变量进行自增操作,然后再返回变量的新值。应避免在同一个表达式中对同一变量多次使用自增运算符。
2025-10-28 09:06:22
296
原创 JDK、JVM、JRE的区别
JRE是Java运行时环境,仅支持运行已编译的Java程序(.class文件)。它包含JVM和运行Java程序所需的核心类库(如java.lang、java.util等),但不包含开发工具(如编译器)。JRE适合普通用户运行Java应用程序。它提供了编译器(javac)、调试器(jdb)、文档生成器(javadoc)等开发工具,以及JRE和JVM。JVM是Java虚拟机,负责执行Java字节码(.class文件)。它是JRE的核心组件,实现了Java的跨平台特性(“一次编写,到处运行”)。
2025-10-27 20:08:05
152
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅