- 博客(82)
- 资源 (1)
- 收藏
- 关注
原创 JDK 21 字符串拼接最佳实践:场景化选择最优方案
JDK 21 字符串拼接需按场景选择最优方案:静态拼接用`+`,编译器自动优化;单线程动态拼接优选`StringBuilder`;格式化模板结合`formatted()`与文本块,提升可读性;集合拼接用`String.join()`或Stream;多线程场景选`StringBuffer`保障安全。
2025-11-20 14:57:32
475
原创 Redisson 分布式锁深度解析:API 使用与底层源码探秘
本文深入解析Redisson分布式锁的使用与源码实现,涵盖可重入锁、公平锁、读写锁、红锁等核心API的应用场景与配置方法,并通过Lua脚本、Hash结构和看门狗机制剖析其原子性、重入性与自动续期原理,助力开发者高效安全地实现分布式并发控制。
2025-11-20 11:11:34
386
原创 深入理解 Java 类加载器:双亲委派机制源码解析
简介: 本文深入解析Java类加载器与双亲委派机制,从Bootstrap到自定义加载器,剖析loadClass源码,揭示类加载的线程安全、缓存机制与委派逻辑,并探讨SPI、Tomcat、OSGi等场景下打破双亲委派的原理与实践价值
2025-11-07 18:15:16
1116
原创 Java 设计模式之备忘录模式:优雅保存与恢复对象状态
备忘录模式在不破坏封装性的前提下,捕获并保存对象状态,支持后续恢复。适用于撤销操作、事务回滚等场景,核心角色包括原发器、备忘录和负责人,实现灵活的状态管理。
2025-10-29 18:15:17
559
原创 Java 设计模式之访问者模式:灵活处理对象集合的操作
访问者模式是一种行为型设计模式,它将数据结构与数据操作分离,在不修改对象结构的情况下为其添加新操作。该模式包含抽象访问者、具体访问者、抽象元素、具体元素和对象结构五个角色。通过公司员工系统的示例展示了访问者模式的实现方式:定义Employee抽象元素及其具体子类(Engineer和Manager),创建Visitor接口和具体访问者(SalaryCalculator和PerformanceEvaluator),使用Company类作为对象结构管理员工集合。这种模式使操作扩展更灵活,符合开闭原则,在编译器AS
2025-10-29 17:16:34
615
原创 Java 设计模式之迭代器模式:优雅遍历集合元素
迭代器模式是一种行为型设计模式,它将集合对象的遍历行为分离出来,封装成独立迭代器对象,实现遍历逻辑与集合的解耦。该模式包含抽象迭代器、具体迭代器、抽象聚合和具体聚合四个角色,可提供统一遍历接口并隐藏集合内部实现。Java集合框架大量应用了此模式,如Iterator接口和ArrayList的iterator()方法。迭代器模式的优点包括支持多种遍历方式、简化聚合类设计等,但会增加系统复杂度。理解此模式有助于设计更灵活的集合遍历方案。
2025-10-29 16:52:16
584
原创 Java 设计模式之工厂模式:对象创建的艺术(含 UML 图解)
工厂模式是Java中经典的创建型设计模式,通过封装对象创建过程实现"创建与使用分离"。文章介绍了三种工厂模式:1)简单工厂模式:通过一个工厂类根据参数创建不同产品,实现简单但违反开闭原则;2)工厂方法模式:为每个产品创建对应工厂类,遵循开闭原则但增加复杂度;3)抽象工厂模式:创建产品族,适合复杂系统但扩展性受限。文中通过计算器、日志记录器等代码示例,结合UML图解,详细阐述了各模式的实现方式、适用场景及优缺点。工厂模式能有效降低耦合、提高扩展性和统一管理对象创建,是Java开发中的重要设
2025-10-27 18:02:58
1016
原创 Java 设计模式之中介者模式:解耦复杂交互的架构艺术(含 UML 图解)
本文介绍了Java设计模式中的中介者模式(Mediator Pattern),该模式通过引入中介对象来解耦复杂系统中多个对象间的交互。文章以聊天室为例,展示了中介者模式的4个核心角色:抽象中介者、具体中介者、抽象同事类和具体同事类,并提供了UML类图和完整代码实现。通过中介者模式,对象间无需直接通信,而是通过中介者协调,从而降低耦合度,使系统更易于维护和扩展。示例中,用户消息通过微信群聊(中介者)转发给其他用户,验证了该模式的有效性。
2025-10-27 17:32:18
810
原创 Java 设计模式之策略模式:灵活切换算法的艺术
策略模式是一种行为型设计模式,通过定义算法族并封装每个算法,使其可以相互替换,实现算法的灵活切换。本文以购物车支付系统为例,演示了策略模式的实现方式:1)定义PaymentStrategy接口作为抽象策略;2)实现微信、支付宝、银行卡等具体支付策略;3)通过ShoppingCart环境类动态切换支付方式。该模式将算法与使用解耦,避免了条件语句的硬编码,提高了系统的扩展性和可维护性。在实际开发中,策略模式适用于需要动态切换算法或行为的场景,如支付方式、排序算法等。
2025-10-24 18:03:52
1114
原创 Java 设计模式之观察者模式:构建松耦合的事件响应系统
摘要:观察者模式是一种松耦合的设计模式,用于构建一对多的对象依赖关系。当被观察者(Subject)状态变化时,所有注册的观察者(Observer)会自动收到通知并更新。文章以气象站系统为例,展示Java实现:定义Observer接口(update方法)和Subject接口(注册/移除观察者方法),具体实现WeatherStation作为被观察者,多个Display面板作为观察者。该模式适用于事件驱动系统,如UI更新、数据监控等场景,能有效降低对象间的直接依赖。
2025-10-24 17:32:20
894
原创 Java 设计模式之状态模式:让对象的行为随状态优雅变化
Java状态模式是一种行为型设计模式,允许对象根据内部状态改变行为。它通过将状态封装成独立类,避免了复杂的条件判断,使代码更清晰易维护。以电商订单为例,订单状态(待支付、已支付、已发货、已完成)各自实现抽象状态接口,定义该状态下的合法操作。环境类(订单)维护当前状态引用,将操作委托给状态对象处理。这种模式实现了状态转换的优雅管理,提升了代码的可扩展性和可读性。
2025-10-23 16:39:27
966
原创 Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式是一种解耦请求发送者和接收者的行为型设计模式,通过构建处理者对象链来处理请求。本文以请假审批系统为例,展示了如何实现责任链模式:创建请求类、抽象处理者、具体处理者(部门主管、经理、总经理),并设置处理链。该模式提高了系统灵活性,支持多级处理流程,常见于审批系统、日志处理和过滤器等场景。优点包括降低耦合度和符合开闭原则,但可能存在请求未处理或调试复杂的问题。Java中的Servlet Filter和Spring Interceptor等都是责任链模式的典型应用。
2025-10-23 10:59:03
687
原创 JDK21 ArrayList 源码深度解析:从底层实现到性能优化
本文解析了JDK21中ArrayList的核心实现机制。ArrayList基于动态数组实现,支持快速随机访问(RandomAccess接口)。关键点包括:1)默认容量10,使用DEFAULTCAPACITY_EMPTY_ELEMENTDATA标记;2)扩容机制通过grow()实现,按旧容量的1.5倍增长;3)添加元素时涉及数组拷贝和扩容判断;4)通过modCount实现快速失败机制。理解这些底层细节有助于优化ArrayList的使用性能。
2025-10-09 14:57:58
666
原创 内存溢出与内存泄漏:解析与解决方案
内存溢出与内存泄漏是程序开发中常见的内存问题。内存泄漏指已分配的内存未被释放,导致内存逐渐耗尽;内存溢出则是申请内存时空间不足,引发程序崩溃。本文通过Java代码示例展示了两种现象的表现形式,并分析了常见场景:静态集合滥用、未关闭资源等会导致内存泄漏,而大数据加载、大对象创建等会引发内存溢出。解决方案包括使用内存分析工具、规范资源管理、优化数据处理流程以及调整JVM参数等。良好的编程习惯和内存监控能有效预防这些问题,确保程序稳定运行。
2025-09-26 17:29:25
913
原创 深入理解 HashMap:从源码到应用的全方位解析
HashMap 是 Java 中常用的数据结构之一,它以键值对的形式存储数据,并且能够在常数时间内完成基本操作。然而,要真正掌握 HashMap 的核心原理,需要深入理解其哈希冲突的解决办法、哈希算法、容量设计、扩容过程、数据结构以及线程安全等方面。本文将从源码角度出发,全面解析 HashMap 的工作机制。
2025-06-05 14:35:55
1017
原创 Java 中 ArrayList、Vector、LinkedList 的核心区别与应用场景
摘要: Java集合框架中,ArrayList、Vector和LinkedList作为List接口的主要实现,各有特点。ArrayList和Vector基于动态数组,支持快速随机访问(O(1)),但插入删除需移动元素(O(n));LinkedList采用双向链表,插入删除高效(O(1)),但随机访问慢(O(n))。Vector通过同步方法实现线程安全,但性能较差;ArrayList和LinkedList则非线程安全。ArrayList扩容1.5倍,Vector默认2倍。LinkedList还实现Deque接
2025-06-04 11:12:27
938
原创 Java中为什么不能使用for循环遍历list过程中去执行list.remove()删除方法,为什么会报错?
在Java中,使用for循环遍历List时直接调用remove()方法会导致ConcurrentModificationException异常。这是因为增强for循环(for-each)依赖迭代器实现,而普通for循环删除元素会导致索引错乱。正确的删除方式包括:使用迭代器的remove()方法、Java 8的removeIf()方法,或采用倒序遍历普通for循环。这些方法能安全删除元素,避免遍历时出现异常或逻辑错误。
2025-06-04 10:24:59
761
原创 Java 中的 synchronized 和 Lock:如何保证线程安全
Java提供了synchronized和Lock两种机制保证线程安全,前者通过对象监视器和锁升级机制实现同步,后者基于AQS框架提供了更灵活的锁操作。synchronized是JVM内置的同步原语,具有可重入性和自动锁释放特性;而Lock接口(如ReentrantLock)则支持公平/非公平锁、可中断获取等高级功能,需要手动释放锁。两者底层实现都基于线程安全三要素(原子性、可见性、有序性),开发者可根据场景选择——简单同步用synchronized,复杂需求用Lock。
2025-05-29 17:25:29
874
原创 Java 中的 ThreadLocal 详解:从基础到源码
本文深入解析Java中的ThreadLocal机制。ThreadLocal为每个线程提供独立的变量副本,实现线程封闭,避免同步问题。文章从基本使用(get/set/remove方法)开始,详细剖析底层实现原理:ThreadLocalMap作为核心数据结构,采用弱引用的Entry数组存储键值对。特别强调内存泄漏风险(因值对象强引用长期存在)及其解决方案,建议及时调用remove()和使用static修饰。最后介绍典型应用场景如数据库连接管理和用户会话存储,并指出在线程池中的注意事项。通过源码分析和代码示例,全
2025-05-29 15:49:02
909
原创 MySQL 索引详解:从基础到原理
MySQL索引详解摘要 本文全面介绍了MySQL索引的核心概念、类型及优化策略。主要内容包括: 索引概述:定义、作用与代价 常见索引类型:普通索引、唯一索引、主键索引、复合索引、全文索引和空间索引 底层数据结构:B-Tree/B+Tree索引原理,InnoDB的聚簇/辅助索引结构 优化策略:最左前缀原则、索引选择性与基数分析、避免索引失效的方法 通过SQL示例和原理分析,帮助开发者合理设计索引以提升查询性能。
2025-05-29 15:29:06
1131
原创 Spring Boot 启动流程深度解析:从源码到实践
本文深入解析了Spring Boot的启动流程,从源码层面剖析了其核心机制。启动入口从@SpringBootApplication注解的main方法开始,通过SpringApplication.run()方法执行初始化,推断应用类型并加载初始器和监听器。run()方法的核心逻辑包括:准备环境、创建上下文、刷新上下文、发布启动事件等关键步骤。Spring Boot通过事件机制在不同启动阶段发布事件,允许开发者介入。文章通过详细代码示例展示了SpringApplication初始化、环境准备和上下文创建等核心流
2025-05-28 18:17:54
1761
原创 SpringBoot 自动装配原理深度解析:从源码到实践
SpringBoot自动装配机制基于"约定大于配置"理念,核心通过@EnableAutoConfiguration注解触发。AutoConfigurationImportSelector负责处理自动装配流程,从META-INF/spring.factories加载候选配置类,并配合条件注解(如@ConditionalOnClass)进行智能筛选。这种机制减少了样板配置,使开发者只需关注必要差异,体现了SpringBoot的智能化设计理念。
2025-05-28 18:12:14
1330
原创 过滤器和拦截器有什么区别?
摘要: 过滤器(Filter)和拦截器(Interceptor)是Web开发中用于请求处理的两种组件,但存在显著差异: 技术定位:Filter基于Servlet规范,在容器层面处理请求;Interceptor是Spring MVC特有,基于AOP实现。 执行时机:Filter优先触发,处理请求/响应原始数据;Interceptor在控制器前后介入,可访问Spring上下文。 功能场景:Filter适合通用底层处理(如编码、跨域);Interceptor适合业务级控制(如权限、日志)。 注册方式:Filter
2025-05-27 11:16:07
927
原创 Spring 循环依赖:从原理到解决方案的全面解析
本文全面解析Spring框架中的循环依赖问题,主要包括以下内容:1. 定义和分类循环依赖,分为构造器、setter和字段注入三种类型;2. 详细阐述Spring通过三级缓存机制处理setter/字段循环依赖的原理和工作流程;3. 分析构造器循环依赖无法自动解决的原因;4. 提供多种解决方案,包括setter注入替代、@Lazy注解和模块化设计;5. 介绍排查工具和源码分析;6. 总结循环依赖的本质是"早期暴露"机制,强调合理设计依赖关系的重要性。全文深入浅出地讲解了Spring循环依赖的
2025-05-26 14:46:04
1162
原创 Java 序列化与反序列化深度解析
Java 序列化与反序列化深度解析:本文全面介绍了Java对象序列化(对象→字节流)与反序列化(字节流→对象)的核心概念、应用场景及实现细节。重点阐述了必须实现Serializable接口的原因、显式指定serialVersionUID的重要性,以及通过transient字段和自定义方法控制序列化过程。文章还分析了序列化在数据持久化、分布式系统和深拷贝中的应用,并指出版本兼容性和安全风险等注意事项,最后提出最佳实践建议,包括合理使用serialVersionUID、处理敏感字段和考虑替代方案等。
2025-05-26 11:52:11
1171
原创 字符编码详解:ASCII、Latin1、Unicode、UTF-8 与 GBK
字符编码是计算机处理文本的基础,常见的编码包括ASCII、Latin1、Unicode、UTF-8和GBK。ASCII是最早的编码标准,仅支持英文字符;Latin1扩展了ASCII,支持西欧语言;Unicode为全球字符提供统一编码,而UTF-8是其最常用的实现方式,具有兼容性和灵活性;GBK是中文专用编码,适用于特定场景。在实际应用中,UTF-8因其全球支持和高效性成为首选,尤其在多语言环境中。理解这些编码的特点和区别,有助于解决乱码和编码转换问题,确保文本处理的准确性。
2025-05-23 16:12:16
1118
原创 Redis数据结构详解
Redis 提供了多种数据结构,包括字符串、列表、集合、有序集合、哈希、位图、HyperLogLog、流和地理空间索引。字符串是最基本的数据类型,适用于缓存、计数器和分布式锁等场景。列表是有序集合,常用于消息队列和任务调度。集合是无序且唯一的元素集合,适合标签系统和社交网络。有序集合在集合基础上增加了分数概念,适用于排行榜和延时队列。哈希用于存储键值对映射,适合对象存储和会话管理。位图基于字符串的二进制位操作,适用于存在性判断和用户签到。每种数据结构都有其特定的应用场景和注意事项,合理选择和使用这些数据结构
2025-05-14 16:26:58
1239
原创 Spring @Lazy注解详解
@Lazy注解是Spring框架中的一个标记注解,主要用于延迟Bean的初始化。其核心作用包括:1)延迟初始化Bean,避免Spring容器在启动时立即创建所有单例Bean,从而优化资源使用和启动时间;2)解决Bean之间的循环依赖问题。@Lazy通过代理机制实现延迟加载,Spring在容器启动时生成代理对象,并在首次访问时触发实际Bean的创建和依赖注入。该注解可以应用于类、方法、构造器、参数和字段上,但需注意代理开销、配置复杂性以及测试调试中的潜在问题。合理使用@Lazy注解可以有效提升应用性能并解决循
2025-05-14 11:18:52
896
原创 Spring自动装配详解
Spring 自动装配通过依赖注入(DI)机制,简化了对象依赖关系的管理,减少了手动配置的工作量。常见的自动装配方式包括按类型装配(By Type)、按名称装配(By Name)、构造器装配(Constructor)以及使用 @Autowired 注解。按类型装配通过匹配属性类型注入 Bean,要求类型唯一;按名称装配则通过属性名匹配 Bean 名称,适用于多个同类型 Bean 的场景;构造器装配通过构造方法注入依赖,适合强制依赖的场景;@Autowired 注解则支持多种注入方式,灵活性高。Spring
2025-05-13 11:22:03
1243
原创 try-catch性能详解!
总的来说,try-catch结构在没有异常发生时对性能的影响通常是可以忽略的,然而,一旦发生异常,其开销可能会显著增加。在实际应用中,开发人员需要在性能和代码的健壮性之间进行权衡:异常处理提供了一种优雅的方式来处理运行时错误,但也可能带来性能开销。在大多数情况下,代码的正确性和可维护性比微小的性能差异更为重要,然而,在一些对性能要求极高的场合,如游戏引擎、实时系统或大规模数据处理系统,开发人员可能需要仔细评估异常处理对性能的影响,并根据具体情况采取相应的优化措施。三两肉。
2024-11-08 10:48:03
1262
原创 RocketMQ消息处理详解!
本文分析了 RocketMQ 同步发送、异步发送和单向发送三种方式的原理、优缺点以及使用场景,并且分析了每种方式涉及到的核心源码。通过上文的介绍可以知道同步发送方式可以保证消息发送时不丢,但是性能相对其他两种方式差一些。三两肉。
2024-10-24 14:15:44
1292
原创 内存溢出与内存泄漏详解!
本文,我们分析了Java的内存溢出和内存泄漏并且应示例展示了它们导致的原因,应该说它们是比较常见的内存管理问题,如果在生产环境出现也是比较头疼的问题。所以在日常开发中,我们一定要注意自己的代码风格和代码质量,尽量避免这些问题的发生。三两肉猿Java。
2024-10-23 15:34:52
1456
原创 Redis内存淘汰机制!
Redis 的内存淘汰机制是其高性能和高可用性的关键保障。通过灵活选择和配置内存淘汰策略,用户可以有效管理内存资源,确保系统的稳定运行。不同的内存淘汰策略适用于不同的应用场景,用户需要根据具体需求进行选择和调优。同时,结合监控和性能测试,用户可以不断优化内存淘汰策略,提升 Redis 的性能和可靠性三两肉猿Java。
2024-10-16 18:15:08
1265
原创 Cookie与Session的区别(特别详细)
Cookie是一种被客户端(通常是浏览器)存储的小型数据文件,服务器发送给客户端后,客户端会在后续向同一服务器的请求中携带这些Cookie数据。这允许服务器识别连续的请求来自同一客户端用户,从而在某种程度上维护状态。Cookie和Session在Web开发中的区别主要体现在数据存储位置、安全性、存储容量和使用场景等方面。选择使用哪种技术或者如何结合使用它们,往往取决于具体项目的需求、安全考虑和性能要求。了解两者的特性,能帮助开发者设计更安全和高效的Web应用程序。三两肉猿Java。
2024-10-16 16:55:35
1090
原创 Linux系统各版本区别,如何选择?
这篇文章,我们分析了 Linux 几种常见的发行版以及它们的优缺点。在实际生产中如何选择,可以参考上面的意见,最终还是需要根据公司或者团队的实际情况来决定。三两肉。
2024-10-16 16:43:55
1841
原创 分布式缓存详解!
分布式缓存是指分布在多个服务器上的缓存。与本地缓存不同,分布式缓存通常部署在独立的应用进程中,并与应用进程部署在不同的机器上。因此,数据读写操作需要通过网络来完成。分布式缓存的主要特点包括:1、可扩展性:当应用程序需要处理大量数据或高并发请求时,可以通过增加服务器节点来扩展分布式缓存的容量和提高性能。2、数据一致性:分布式缓存的数据一致性可以通过各种技术实现,如缓存同步、分布式锁等。3、独立部署:分布式缓存通常部署在独立的应用进程中,与应用程序分离,多个应用可以直接共享缓存。
2024-10-15 18:14:05
2197
原创 布隆过滤器原理及优缺点详解!
布隆过滤器原理及优缺点详解!,布隆过滤器是一种简单但非常有效的数据结构,特别适用于大规模数据的快速查找和去重等场景。尽管它有一定的误判率,但在很多应用中,这一点点误判是可以接受的。三两肉猿Java。
2024-10-14 11:36:30
1353
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅