- 博客(62)
- 收藏
- 关注
原创 ThreadLocal 核心原理详解:Thread、ThreadLocalMap 与生命周期
本文深入解析了ThreadLocal的核心原理及其内存管理机制。ThreadLocal作为线程私有数据的存储工具,通过ThreadLocalMap实现数据隔离,其生命周期与线程绑定。关键点包括:1) ThreadLocal本身不存数据,仅作为操作ThreadLocalMap的API工具;2) ThreadLocalMap采用弱引用key设计,防止ThreadLocal对象无法回收;3) 线程池场景下需手动remove避免内存泄漏和数据错乱;4) 与HashMap相比,ThreadLocalMap在线程安全、
2026-04-22 13:17:47
428
原创 一文搞懂:网关过滤器、Servlet 过滤器、MVC 拦截器、Feign 拦截器
本文深入解析微服务开发中四种易混淆的拦截组件:网关过滤器、Servlet过滤器、Spring拦截器和Feign拦截器。网关过滤器作为全局入口负责JWT鉴权和路由转发;Servlet过滤器处理编码等基础过滤;Spring拦截器实现服务内部精细化校验;Feign拦截器专管服务间调用的Token透传。通过对比表格和典型场景说明,清晰区分各组件的适用场景(如网关做全局鉴权而非Servlet过滤器),并给出JWT校验、Token透传等实际解决方案,帮助开发者正确选择和使用这些组件。(149字)
2026-04-20 17:54:44
803
1
原创 动态规划内外循环能乱换吗?从 01 背包与完全背包,讲透遍历顺序的底层逻辑
在刷动态规划题时,很多人都会陷入一个共性误区:只要把状态转移公式写对,DP 的内外循环顺序随便换,结果都能正确。但实际刷题中却会发现:同样的转移逻辑,换一下内外循环,要么答案出错,要么超时,甚至直接违背题目约束。尤其是在最经典的01 背包与完全背包问题中,遍历顺序的坑更是无处不在:二维数组求最值时内外循环能互换吗?一维数组为什么绝对不能换?求组合数和排列数时,顺序互换为什么会直接改变答案?
2026-04-15 11:00:00
878
原创 力扣 2463. 最小移动总距离 —— 动态规划 & 贪心排序全解(Java 实现)
在动态规划与贪心算法结合的面试题库中,LeetCode 2463 最小移动总距离是一道极具代表性的经典难题。它以「X 轴上机器人与工厂的最优匹配」为目标,既不依赖复杂数学推导,也不涉及冷门数据结构,却精准考察了贪心排序思想、状态定义设计、分组背包模型转化以及空间优化四大核心能力。看似简单的机器人分配问题,背后藏着从暴力枚举到最优子结构的完整算法演进逻辑,也是面试官常用来检验算法思维是否严谨的高频考题。
2026-04-14 16:15:24
513
原创 力扣 494. 目标和 —— 回溯 & 动态规划双解法全解(Java 实现)
在数组与动态规划结合的面试题库中,LeetCode 494 目标和是一道极具代表性的经典题目。它以 “给数组元素添加正负号得到目标和” 为目标,既不依赖复杂数学推导,也不涉及冷门数据结构,却精准考察了回溯剪枝思想、状态定义设计、0-1 背包模型转化以及空间优化四大核心能力。看似简单的符号选择,背后藏着从暴力穷举到最优子结构的完整算法演进逻辑,也是面试官常用来检验算法思维是否严谨的高频考题。
2026-04-13 10:50:03
530
原创 力扣 968. 监控二叉树 —— 贪心 & 树形 DP 双解法递归 + 非递归全解(Java 实现)
这篇文章详细讲解了LeetCode 968监控二叉树问题的两种解法:贪心算法和动态规划。贪心算法采用后序遍历策略,自底向上决策,优先在父节点安装摄像头以最大化覆盖范围。动态规划则定义三种节点状态,通过状态转移计算最优解。两种方法都提供了递归和非递归实现,递归版简洁直观,非递归版更稳健适合工程应用。文章深入分析了每种解法的核心思路、状态转移逻辑和代码实现,帮助读者全面掌握这道经典二叉树问题的解法,并能灵活应对面试中的各种考察形式。
2026-04-12 13:00:00
550
原创 力扣 51. N 皇后:基础回溯、布尔数组优化、位运算全解(Java 实现)
LeetCode 51 N 皇后问题是回溯算法的绝对经典标杆题,更是面试中考察递归逻辑、剪枝思维与空间优化的核心考点。这道题的核心是破解 “如何在 N×N 棋盘上摆放 N 个皇后,使其互不攻击”,而基础回溯遍历校验、布尔数组优化、位运算优化则是解决该问题的三大进阶思路 —— 三者从暴力到优雅、从直观到极致,在时间 / 空间复杂度与代码抽象程度上层层递进,完美对应了算法思维从入门到高阶的成长路径。
2026-04-11 11:00:00
832
原创 深度解析:Stable Diffusion 底层原理 + U-Net Denoise 去噪机制全拆解
本文深入解析了Stable Diffusion文生图技术的底层原理,重点阐述了其核心去噪机制。首先通过CLIP文本编码器将用户输入的提示词转换为语义向量,作为生成条件。然后从随机噪声出发,在潜空间中通过U-Net进行数十步迭代去噪:每一步根据文本条件预测噪声,并通过CFG系数控制去噪强度,逐步还原图像内容。最后通过VAE解码器将64×64×4的潜特征上采样为512×512×3的RGB图像,经后处理输出最终图片。整个过程展现了"从噪声中还原图像"的生成本质,四大核心组件(CLIP、U-Ne
2026-04-10 14:41:42
750
原创 Stable Diffusion 核心模块深度拆解:CLIP、U-Net 与 VAE 原理全解析
本文深入解析了Stable Diffusion文生图系统的三大核心模块:CLIP文本编码器、U-Net去噪网络和VAE变分自编码器。CLIP通过跨模态对比学习将文本提示转化为语义向量;U-Net在潜在空间执行多步迭代去噪,结合跳跃连接实现多尺度特征融合;VAE则完成潜在空间与像素空间的双向转换。这三个模块协同工作,分别承担语义理解、图像生成和空间转换功能,共同实现了从文本到高质量图像的生成流程。文章不仅阐述了各模块的结构原理,还揭示了它们协同工作的完整技术链路,为理解Stable Diffusion的底层机
2026-04-09 10:00:00
723
原创 Stable Diffusion 入门:架构、空间与生成流程概览
StableDiffusion是一种基于隐空间扩散模型的开源AI绘画系统,其核心创新在于将传统扩散模型的像素空间运算转移到低维潜在空间,大幅提升了计算效率。该系统由三大功能模块组成:输入编码器将文本转换为语义向量,图片生成器在潜在空间进行扩散去噪,图片解码器将特征还原为可视图像。这种"像素空间-潜在空间"的转换架构使得模型在保持生成质量的同时显著降低了计算成本,成为AI绘画领域的基础设施,广泛应用于创意设计、影视游戏、科研工业等多个领域。
2026-04-08 12:09:23
898
原创 Nginx vs Ribbon:负载均衡的两种核心范式(反向代理 vs 客户端负载)
本文深入分析了Nginx与Ribbon两种负载均衡技术的核心区别。Nginx作为服务端负载均衡,采用反向代理模式,具有高性能的异步非阻塞架构;Ribbon则是客户端负载均衡,嵌入服务消费者进程,直接调用目标实例。文章详细对比了二者的架构位置、实现原理和适用场景,指出Nginx适合入口流量分发,Ribbon更适合微服务内部调用。同时介绍了SpringCloud LoadBalancer作为Ribbon的替代方案,强调在微服务架构中合理选择负载均衡技术对系统性能的重要性。通过具体案例和流程分析,帮助开发者理解不
2026-04-02 16:13:18
996
1
原创 Java 设计模式・解释器模式篇:从思想到代码实现
本文介绍了行为型设计模式中的解释器模式(Interpreter Pattern)。该模式通过定义语言的文法规则和对应的解释器,实现对特定语句的解释执行。文章详细阐述了解释器模式的核心概念(文法规则、抽象语法树)、角色划分(抽象表达式、终结符/非终结符表达式、环境角色)以及Java代码实现示例。分析了其优点(易于扩展、结构清晰)和缺点(复杂文法难维护、执行效率低),并列举了适用场景(简单文法、自定义语言解释)与不适用场景(复杂语法、高性能需求)。最后通过对比组合模式、访问者模式和模板方法模式,以及JDK正则表
2026-03-28 10:00:00
877
1
原创 Java 设计模式・备忘录模式篇:从思想到代码实现
本文系统介绍了行为型设计模式中的备忘录模式(Memento Pattern)。该模式通过在不破坏封装性的前提下捕获对象内部状态并保存,实现状态回退和撤销功能。文章详细阐述了备忘录模式的两种实现方式(白箱和黑箱),对比分析了其优缺点及适用场景,并提供了Java代码示例。此外,还将备忘录模式与命令模式、原型模式进行对比,指出其在游戏存档、编辑器撤销等场景的应用价值。最后提到Java序列化机制本质上是备忘录模式的一种实现。该模式的核心优势在于封装状态数据并支持历史状态恢复,但需注意内存消耗问题。
2026-03-27 14:24:27
763
原创 Java 设计模式・访问者模式篇:从思想到代码实现
行为型设计模式通过定义对象间的通信方式和职责分配,提升代码的灵活性和可维护性。本文重点介绍了访问者模式,它通过双分派机制实现操作与数据结构的解耦,使新增操作时无需修改元素类。访问者模式包含抽象访问者、具体访问者、抽象元素、具体元素和对象结构五个角色,适用于数据结构固定但操作频繁变化的场景。其优点是操作扩展灵活、管理集中,缺点是破坏封装性且数据结构扩展困难。文中还通过宠物喂养的代码示例和Java序列化源码分析,展示了访问者模式的实际应用,并与其他行为型模式进行了对比分析。
2026-03-26 10:00:00
1106
原创 MyBatis @Param 注解详解:为什么 mapper 接口参数必须加它?
本文深入解析MyBatis中@Param注解的使用场景与原理。文章指出,@Param注解在Mapper接口参数传递中起关键作用,其使用需根据参数数量、类型灵活判断:单参数可不加,多参数必须加,集合参数需自定义名称时必须加。底层原理是@Param通过ParamNameResolver类为参数命名,确保SQL正确绑定。文章还揭示了IDEA默认保留参数名的特性,但建议规范使用@Param以避免环境差异问题。通过详细拆解各种应用场景和实现机制,帮助开发者彻底掌握@Param的正确用法,规避参数传递常见错误。
2026-03-25 10:00:00
830
原创 微服务请求全链路解析:从前端到微服务,一次看懂 Nginx、Nacos、网关与 MVC 拦截器到底干了啥
本文详细剖析了微服务架构下一次HTTP请求的完整生命周期。当用户发起请求时,请求首先经过DNS解析和TCP三次握手,随后由Nginx反向代理转发至网关层。网关执行身份认证、权限校验等前置过滤,并通过Nacos服务发现获取目标微服务实例。业务处理过程中,Feign客户端实现跨服务调用,各微服务通过ThreadLocal共享上下文。最终响应数据经网关后置过滤器和Nginx返回客户端。整个流程涉及服务注册发现、负载均衡、链路追踪等微服务核心机制,展现了现代分布式系统的高效协同运作。
2026-03-24 15:52:14
598
原创 Java 设计模式・迭代器模式篇:从思想到代码实现
摘要:迭代器模式是一种行为型设计模式,用于提供统一的方法顺序访问聚合对象中的元素,同时隐藏其内部结构。该模式将遍历逻辑从聚合类中抽离,通过迭代器接口(如hasNext()、next())实现解耦,支持多种遍历方式且符合单一职责原则。虽然会增加系统复杂度,但特别适用于需要统一遍历不同数据结构、隐藏内部实现或支持多种遍历方式的场景。Java集合框架中的Iterator接口是典型实现,相比普通for循环具有更好的封装性和扩展性,但简单遍历场景可能造成过度设计。模式包含抽象聚合、具体聚合、抽象迭代器和具体迭代器四个
2026-03-22 10:53:40
712
原创 Java 设计模式・中介者模式篇:从思想到代码实现
行为型设计模式关注对象间的交互与职责分配,通过命令、迭代、观察者等11种模式提升代码灵活性和可维护性。本文重点解析中介者模式,该模式通过引入中介对象(如租房中介)协调多个对象(房东、租客)间的交互,将网状依赖转为星型结构,降低耦合度。代码示例展示了中介者模式在租房场景中的实现,包括抽象中介者、具体中介公司、客户角色等核心组件。该模式适用于复杂交互场景(如聊天室、UI组件联动),但需警惕中介者过度膨胀的风险。文章还对比了中介者与观察者、状态等模式的区别,并分析了AWT事件机制中的源码应用。
2026-03-21 11:43:07
896
原创 Java 设计模式・观察者模式篇:从思想到代码实现
摘要:本文介绍了行为型设计模式中的观察者模式,通过微信公众号订阅的实例展示了该模式的实现方式。观察者模式实现对象间一对多的依赖关系,当被观察者状态变化时自动通知所有观察者。文章详细说明了模式角色(抽象/具体观察者、抽象/具体被观察者)、Java代码实现、优缺点分析及适用场景,并与发布-订阅模式进行对比。同时指出JDK中原生支持但已废弃的Observable/Observer实现,强调该模式在事件监听、状态同步等场景的应用价值。
2026-03-20 13:25:21
790
原创 Java 设计模式・状态模式篇:从思想到代码实现
摘要:本文系统介绍了行为型设计模式中的状态模式及其应用。状态模式通过封装对象的不同状态及其转换逻辑,实现对象行为随内部状态自动变化。文章详细阐述了状态模式的三大角色(环境、抽象状态、具体状态),并以订单状态流转为例展示了Java代码实现。通过对比策略模式、责任链模式和if/else实现方式,分析了状态模式在消除条件判断、提高扩展性方面的优势,以及可能导致的类膨胀问题。最后指出该模式适用于多状态、复杂流转场景,而不适用于简单状态管理。
2026-03-19 10:00:00
773
原创 Spring 配置类常用注解,一篇就够了
本文系统梳理了Spring配置类中的核心注解,详细解析了@ComponentScan、@PropertySource、@Conditional系列、@Lazy和@Profile等常用注解的功能特点和使用场景。通过对比注解间的差异与优先级,帮助开发者深入理解Spring容器初始化机制,掌握配置类的最佳实践。文章特别强调注解的合理组合使用,如@PropertySource与@ConfigurationProperties的配置绑定组合,以及@Conditional系列注解在自动配置中的关键作用。同时针对常见开发
2026-03-18 10:00:00
781
原创 Spring 核心机制:到底什么样的类才算配置类?@Configuration 与 @Component 的本质区别
本文系统梳理了Spring配置类的核心概念与实现形式。配置类(@Configuration)是Spring容器进行资源加载和Bean定义的核心入口,与普通组件类(@Component)存在本质区别。文章详细解析了配置类的定义标准、实现方式(标准注解式、简化注解式、非注解式、间接导入式)及其适用场景,深入探讨了@Bean和@Configuration注解的作用原理与使用规范。同时对比了不同配置形式(@Component+@Bean、XML配置等)的差异与优劣,强调@Configuration作为官方推荐方式在
2026-03-17 15:43:46
420
原创 彻底搞懂:常量池、字符串常量池、运行时常量池、静态常量池,一篇讲清
本文深入解析Java常量池体系,包括静态常量池、运行时常量池和字符串常量池。静态常量池是编译期产物,存储在.class文件中,包含字面量和符号引用;运行时常量池是静态常量池在内存中的运行时版本,可动态扩展,存储解析后的直接引用;字符串常量池是专门优化字符串存储的特殊区域。文章详细阐述了它们的存储位置、加载时机、作用范围及生命周期差异,并分析了符号引用的重要性、类的加载过程以及字符串创建的不同方式。通过对比JDK不同版本的实现变化,帮助开发者彻底理解常量池的核心机制。
2026-03-15 10:00:00
872
原创 Java 设计模式・责任链模式篇:从思想到代码实现
本文系统介绍了行为型设计模式中的责任链模式。该模式通过将多个处理者连成一条链,使请求沿着链传递直至被处理,实现请求与处理的解耦。文章详细阐述了责任链模式的角色划分(抽象处理者、具体处理者、客户类)、代码实现(以请假审批流程为例),并分析了其优缺点:优点包括解耦、职责单一、灵活扩展;缺点涉及性能损耗、调试困难等。同时列举了适用场景(多级审批、预处理链路)与不适用场景(简单逻辑、高性能要求),并与其他模式(策略、命令、装饰器)进行对比。最后以Spring拦截器为例展示了该模式在源码中的应用。
2026-03-14 09:49:16
847
原创 从 JVM 底层拆解:i++、++i、i+=1、i=i+1 的实现逻辑与坑点
本文从JVM字节码层面深入分析了Java中i++、++i、i+=1和i=i+1四种自增操作的底层实现差异。通过拆解局部变量表和操作数栈的交互机制,揭示了i=i++结果为0的反直觉现象本质:后置自增(i++)会先将原值压栈再自增,导致赋值时用栈中原值覆盖自增结果。对比发现,++i直接通过iinc指令修改局部变量表,效率最高;i+=1和i=i+1完全依赖操作数栈运算,指令最多;i++需要额外栈操作保留原值。理解这些差异有助于编写高效代码和排查相关bug。
2026-03-13 10:45:00
821
原创 深入浅出 AOP:织入时机、JDK 动态代理与 CGLIB 原理及 Spring 选择策略
对比维度JDK 动态代理CGLIB 动态代理核心前提被代理类必须实现至少一个接口被代理类无需实现接口,基于继承生成子类底层技术依赖包,核心是反射依赖 ASM 字节码框架,直接生成字节码调用机制首次调用走反射,后续优化为动态字节码直接调用借助FastClass,全程无反射直接调用方法支持仅支持代理接口的public方法原生支持非 private/final 方法,Spring 封装后默认仅增强 public代理对象类型接口的实现类,仅能强转为接口类型被代理类的子类,可强转为被代理类本身。
2026-03-12 10:45:00
874
原创 力扣 5. 最长回文子串:动态规划、中心扩展、Manacher 算法全解(Java 实现)
对比维度动态规划 (DP)中心扩散法Manacher 算法核心思想利用子问题重叠性,自底向上构建解,通过dp[i][j]记录子串s[i..j]是否为回文。枚举所有可能的回文中心(字符或字符间隙),向两侧扩展,记录最长回文。利用回文对称性,通过预处理将偶数长度回文转为奇数长度,避免重复计算,实现线性时间。时间复杂度O(n²)O(n²)O (n)(线性时间,最优)空间复杂度O (n²)(可优化至 O (n) 滚动数组)O (1)(仅用常数额外空间)O (n)(预处理字符串和辅助数组)实现难度。
2026-03-11 10:45:00
764
原创 力扣 28. 找出字符串中第一个匹配项的下标:从暴力到 KMP 算法详解(Java 实现)
本文系统讲解了字符串匹配问题LeetCode28的两种解法:暴力匹配和KMP算法。暴力匹配通过逐个字符比对实现,时间复杂度为O(n*m),实现简单但效率低。KMP算法利用共同前后缀思想预处理模式串生成pi数组,在匹配时主串不回退,通过pi数组指导模式串跳转,将时间复杂度优化至O(n+m)。文章详细剖析了KMP的核心思想,给出了完整的Java实现代码,包括pi数组的计算和主串匹配流程,帮助读者从原理到实践全面掌握这一经典算法。两种方法各有优劣,KMP虽复杂但效率更高,适合处理大规模文本匹配。
2026-03-10 10:00:00
671
原创 力扣 42. 接雨水:动态规划 / 单调栈 / 双指针 三种解法全解析(Java 实现)
本文系统讲解了LeetCode42接雨水问题的三种解法:1)动态规划法(O(n)时间+O(n)空间),通过预存左右最大高度纵向计算;2)双指针法(O(n)时间+O(1)空间),通过"谁小移谁"策略优化空间;3)单调栈法(O(n)时间+O(n)空间),维护递减栈横向计算凹槽面积。三种方法分别体现了不同的算法思想,动态规划易于理解,双指针空间最优,单调栈则提供了横向计算的新视角。每种方法均附有Java实现代码,全面覆盖该题的求解思路。
2026-03-09 10:00:00
1189
原创 Java 16+ 新特性:一篇吃透 Record,告别冗余 POJO
Java Record是Java 16引入的一种特殊类,专门用于简化不可变数据载体类(如DTO、VO等)的定义。它通过编译器自动生成构造器、访问器、equals/hashCode/toString等方法,大幅减少模板代码。Record的核心特性包括:组件字段自动转为private final,保证不可变性;支持紧凑构造器进行参数校验;允许自定义静态字段和方法,但禁止实例代码块和非静态字段。Record适用于纯数据存储场景,通过简洁语法提供安全规范的数据类定义,同时保持与普通类的互操作性。使用时需注意其设计限
2026-03-08 10:45:00
798
原创 Java 多态核心:继承、方法重载与重写,从语法到设计思想全解析
本文系统解析了Java面向对象编程中的继承、方法重载与重写三大核心概念。继承通过extends实现代码复用,子类可继承父类字段和方法(受访问权限限制),但构造方法无法继承。方法重载(Overload)是同一类中同名不同参数的方法,而方法重写(Override)是子类重新定义父类方法,实现多态特性。文章详细对比了两者的区别,包括参数列表、返回值、访问权限等约束条件,并强调静态方法只能隐藏不能重写。同时指出字段访问是编译时绑定无多态,而方法调用支持运行时多态绑定。最后澄清了返回值、访问权限和异常处理在方法重写中
2026-03-07 10:45:00
682
原创 彻底搞懂 final 和 static:从修饰类、方法到字段的全场景指南
摘要:本文深入解析Java中final和static修饰符的核心概念与使用场景。static修饰类成员表示其属于类本身而非实例,控制生命周期和访问方式;final则限制类、方法或变量的不可修改性。文章详细对比了二者在字段、方法、代码块及类中的不同表现,重点分析了静态字段、静态代码块、实例字段、实例代码块的执行顺序,解释了static final组合定义常量的优势,并阐述了静态内部类与非静态内部类的本质区别。通过执行时机、优先级和使用场景的系统梳理,帮助开发者清晰掌握这两个关键修饰符的应用要点与常见误区。
2026-03-06 09:45:00
712
原创 Java 设计模式・命令模式篇:从思想到代码实现
摘要:行为型设计模式关注对象间交互与职责分配,提升代码灵活性和可维护性。命令模式是其中一种,通过将请求封装为对象实现调用者与接收者解耦,支持撤销、排队等功能。文章以餐厅点餐为例,展示了命令模式的基本实现、撤销功能扩展和队列处理优化,并分析了其优缺点及适用场景。模式适用于需要解耦、支持撤销或批量操作的场景,但在简单业务中可能过度设计。文中还对比了策略模式、装饰器模式等,并列举了JDK中Runnable接口的命令模式实现。
2026-03-05 15:51:25
718
原创 Java 设计模式・策略模式篇:从思想到代码实现
行为型设计模式关注对象间的交互和职责分配,提升代码灵活性和可维护性。策略模式是其中一种经典实现,它通过封装算法实现逻辑与使用方的解耦,支持动态切换策略。该模式包含抽象策略、具体策略和环境类三个角色,典型应用如支付方式选择、排序算法切换等场景。策略模式优点包括消除冗余条件判断、遵循开闭原则、提高复用性;缺点是可能增加类数量。适用场景为需要动态切换算法实现的情况,与工厂模式、模板方法模式等存在设计目标差异。Java中的Comparator接口是策略模式的典型应用。
2026-03-04 10:30:00
1013
原创 Spring Boot 配置读取:@Value 与 @ConfigurationProperties 怎么选?
SpringBoot中@Value与@ConfigurationProperties配置读取对比 摘要:本文对比分析了SpringBoot中两种核心配置读取方式。@Value适合简单配置注入,支持基础类型但缺乏复杂类型转换能力;@ConfigurationProperties专为结构化配置设计,支持批量绑定、类型转换、嵌套属性及校验功能。关键差异体现在:1)松散绑定支持度;2)时间/集合/POPO转换能力;3)默认值设置方式。实际开发中,推荐复杂配置使用@ConfigurationProperties,简单
2026-03-03 10:30:00
1622
原创 Java 设计模式・总结目录篇:从思想到代码实现
设计模式是解决软件设计中常见问题的可复用方案,主要分为三类:创建型模式(如单例、工厂、建造者、原型模式)关注对象的创建;结构型模式(如代理、适配器、装饰器、桥接等)处理类与对象的组合;行为型模式(如策略、观察者、责任链等)定义对象间的交互方式。这些模式通过封装变化、解耦依赖,提高代码的灵活性、可扩展性和可维护性,帮助开发者应对复杂业务场景下的设计挑战。
2026-03-02 10:00:00
728
原创 Java 设计模式・模板方法模式篇:从思想到代码实现
行为型设计模式关注对象间的交互与职责分配,通过11种经典模式(如模板方法、策略、观察者等)提升代码灵活性。模板方法模式通过定义算法骨架(父类)和延迟步骤实现(子类)实现代码复用,典型应用包括Spring容器初始化流程。该模式优点包括流程标准化、易于扩展,但存在类膨胀、继承限制等缺点。与其他模式相比,模板方法与工厂方法模式都基于继承,但前者关注流程定义,后者侧重对象创建;与建造者模式相比,前者强调算法步骤顺序,后者注重产品部件组装。
2026-03-01 19:31:38
1159
原创 Java 设计模式・享元模式篇:从思想到代码实现
享元模式是一种结构型设计模式,通过共享对象来有效支持大量细粒度对象。它将对象状态分为内部状态(固定可共享)和外部状态(可变不可共享),通过享元工厂管理共享对象。该模式适用于对象数量多且相似的情况,能显著减少内存占用和对象创建开销,但会增加系统复杂度。文中以围棋棋子为例展示了代码实现,并对比了单例、原型等模式,指出其核心优势在于对象复用。Java的Integer缓存机制是典型应用。
2026-02-28 15:01:36
877
原创 Java 设计模式・组合模式篇:从思想到代码实现
摘要:组合模式是一种结构型设计模式,用于将对象组织成树形结构,使客户端能够统一处理单个对象和组合对象。该模式包含抽象根节点、树枝节点和叶子节点三个角色,分为透明组合模式和安全组合模式两种实现方式。透明模式统一接口但存在安全风险,安全模式区分节点类型但丧失透明性。组合模式适用于文件系统、菜单树等层级结构场景,优点包括简化客户端代码、符合开闭原则,缺点可能带来过度设计。与装饰者模式、适配器模式等其他结构型模式相比,组合模式专注于构建"整体-部分"关系。Java AWT组件体系是组合模式的典型
2026-02-27 20:19:25
998
原创 基于动态规划的旅行商问题 (TSP) Java 完整实现
本文介绍了旅行商问题(TSP)的动态规划解法。首先分析了暴力解法O(n!)的时间复杂度问题,然后提出使用状态压缩动态规划方法。核心思路是用二进制数表示城市访问状态,定义dp[mask][u]表示从起点出发访问mask对应城市集合后停在u的最短路径。详细阐述了递推公式、二进制状态表示方法、位运算优化、二维表格设计及初始化过程。重点说明了遍历顺序、无效状态判定和集合操作等关键步骤,最终返回dp[0][n-1]作为最优解。该算法通过状态压缩将时间复杂度从阶乘级降低到指数级,显著提升了计算效率。
2026-02-26 19:58:34
1179
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅