- 博客(95)
- 收藏
- 关注
原创 【设计模式】装饰者模式详解
装饰者模式是一种动态扩展对象功能的设计模式,通过组合而非继承的方式实现。该模式解决了继承导致的类爆炸问题,允许在运行时灵活添加功能。其核心思想是"对扩展开放,对修改关闭",包含抽象组件、具体组件、抽象装饰者和具体装饰者四个角色。典型应用如咖啡加料系统,通过装饰类叠加功能(如加牛奶、加糖)。该模式优点包括避免类爆炸、灵活扩展,但会增加类数量和调试难度。JDK中的IO流体系是经典实现(如BufferedInputStream包装FileInputStream)。适用于需要功能自由组合的场景。
2026-01-09 10:40:55
584
原创 【设计模式】适配器模式(Adapter)详解
适配器模式是一种结构型设计模式,用于解决接口不兼容问题。它通过将现有类的接口转换为客户端期望的接口,实现不修改原有代码的兼容性。模式包含目标接口(Target)、被适配者(Adaptee)和适配器(Adapter)三个角色,分为对象适配器(推荐,基于组合)和类适配器(基于继承)两种实现方式。典型应用场景包括老系统改造、第三方库接入等。适配器模式符合开闭原则,但过度使用会增加系统复杂度。与代理模式(控制访问)和装饰器模式(功能增强)不同,其核心是接口转换。
2026-01-08 22:58:34
763
原创 【设计模式】代理模式(Proxy)详解:在不修改源码的前提下增强功能
摘要: 代理模式通过引入代理对象间接访问真实对象,在不修改原代码的情况下实现功能增强(如日志、权限控制等)。包含静态代理(需手动编写代理类)、JDK动态代理(基于接口)和CGLIB代理(基于继承)三种实现方式,各有适用场景。Spring AOP即基于代理模式实现。其核心优势是解耦业务逻辑与增强逻辑,符合开闭原则,但会增加系统复杂度。适用于需统一处理方法的场景,如框架开发,而不适用于性能敏感的核心路径。代理模式与装饰器模式的区别在于前者控制访问,后者专注功能叠加。 (字数:150)
2026-01-07 20:21:28
783
原创 【设计模式】建造者模式(Builder Pattern)详解
本文介绍了建造者模式在解决复杂对象创建问题中的应用。当构造函数参数过多导致可读性差、参数顺序易错时,建造者模式通过分步骤构建的方式提供解决方案。该模式包含产品类、抽象建造者、具体建造者和指挥者四个角色,核心思想是将对象的构建过程与表示分离。以计算机组装为例,演示了如何通过Builder类实现灵活的对象创建,并分析了该模式的优缺点:提升可读性、支持不可变对象,但会增加代码复杂度。最后指出建造者模式适用于属性多、构建步骤固定的场景,但不应滥用。文中还列举了JDK中StringBuilder等实际应用案例。
2026-01-06 20:31:09
804
原创 【设计模式】原型模式(Prototype Pattern)详解
摘要: 原型模式通过复制已有对象(原型)来创建新对象,避免重复初始化带来的性能开销。核心思想是“拷贝”而非重新构造,适用于创建成本高、对象差异小的场景。Java通过Cloneable接口支持原型模式,但需注意浅拷贝(仅复制对象本身)与深拷贝(复制对象及引用对象)的区别。优点包括提高性能、简化创建过程,缺点在于实现复杂且可能破坏封装性。典型应用包括Spring的prototype作用域、游戏角色复制等。使用时应权衡对象创建成本,避免过度设计。
2026-01-04 19:27:42
762
原创 【设计模式】抽象工厂模式(Abstract Factory)详解:一次创建“一整套产品”
本文介绍了抽象工厂模式的设计思想与应用场景。该模式通过创建产品族(一组相互关联的对象)来解决工厂方法模式在复杂场景下的局限性。文章详细阐述了抽象工厂的角色组成、实现方式(以跨平台UI组件库为例)及其优缺点。相比工厂方法模式,抽象工厂更适合需要创建整套产品的系统,如JDBC数据库访问组件等框架级应用。核心优势是保证产品一致性,但扩展新产品等级较困难。适用于强调产品协作关系的平台系统,而不适合产品结构频繁变化的小型项目。
2026-01-03 16:08:09
976
原创 【设计模式】工厂方法模式(Factory Method)详解:从简单工厂到真正的“面向扩展”
摘要: 工厂方法模式通过将对象创建延迟到子类,解决了简单工厂模式违反开闭原则的问题。它包含抽象产品、具体产品、抽象工厂和具体工厂四个角色,以日志系统为例展示了文件日志和数据库日志的实现方式。相比简单工厂,工厂方法模式扩展性更强,但会增加类的数量。适用于产品类型频繁扩展的场景(如框架开发),但不适合小型项目。JDK中的Collection.iterator()体现了该模式思想。核心优势是解耦客户端与具体产品,支持灵活扩展,但需权衡设计复杂度。
2026-01-03 12:16:40
1109
原创 简单工厂模式介绍
简单工厂模式是一种创建型设计模式,通过专门的工厂类封装对象创建过程,实现创建与使用的解耦。该模式包含抽象产品、具体产品和工厂类三个角色,将原本分散的对象创建逻辑集中管理。其优点是简化客户端代码、提高可维护性,但缺点是违背开闭原则,扩展时需要修改工厂类。适用于产品种类少、创建逻辑简单的场景,不适用于需要频繁扩展的大型系统。作为基础模式,它为更复杂的工厂方法模式和抽象工厂模式奠定了基础。
2026-01-02 20:37:28
684
原创 【Java】深入理解 Java 枚举(Enum)
本文介绍了Java枚举(Enum)的特性与应用场景。首先分析了传统int/String常量存在的问题,如类型不安全、可读性差等。然后详细讲解了枚举的定义、基本用法和优势,包括类型安全、可读性强、天然单例等特点。重点阐述了枚举作为类的本质,如何添加字段和方法,以及常用内置方法的使用。文章还探讨了枚举实现接口、作为单例模式的最佳实践,以及与常量类的对比。最后指出枚举在序列化安全性和线程安全方面的优势,是表示固定常量集合的理想选择。
2026-01-01 19:14:40
946
原创 【Java】 理解Java 的 binarySearch 方法
二分查找是一种高效的搜索算法,适用于有序序列。其核心思想是通过每次将搜索区间减半来快速定位目标值。Java提供了Arrays.binarySearch和Collections.binarySearch两种实现,分别用于数组和集合。使用时必须确保数据有序,否则结果不可靠。当找到目标时返回其索引;未找到时返回-(插入点)-1,其中插入点是保持有序时应插入的位置。对象数组需实现Comparable或提供匹配的Comparator。该算法时间复杂度为O(log n),空间复杂度O(1),是处理有序数据的理想选择。
2025-12-31 10:57:33
650
原创 【设计模式】理解单例模式:从原理到最佳实践
单例模式是一种确保类只有一个实例并提供全局访问点的设计模式。文章介绍了单例模式的多种实现方式,包括饿汉式(静态变量、静态代码块)、懒汉式(基础版、同步方法、双重检查锁、静态内部类)以及枚举式实现。重点分析了各种方式的线程安全性、性能优劣及适用场景,推荐使用枚举或静态内部类实现。此外,还探讨了防御反射攻击和序列化破坏的方法,强调枚举实现是最佳实践。单例模式适用于配置中心、数据库连接池等需要全局唯一实例的场景。
2025-12-28 12:48:15
1239
原创 【UML】面向对象中类与类之间的关系详解
作为程序员,在学习或使用面向对象编程(OOP)时,类与类之间的关系是一个绕不开的话题。合理地建模类之间的关系,不仅能让代码更清晰,也能显著提升系统的可维护性和扩展性。本文将详细介绍类和类之间的关系模式。
2025-12-27 20:21:36
1275
原创 什么是 NAT?一文搞懂网络地址转换
NAT(网络地址转换)是解决IPv4地址短缺的关键技术,通过将私有IP转换为公网IP实现多设备共享上网。其核心类型包括静态NAT(固定映射)、动态NAT(动态分配)和PAT(基于端口的转换)。NAT虽节省IP并增强安全性,但会破坏端到端通信,影响P2P等协议。在云计算和家庭网络中广泛应用,如端口映射和云网关。尽管IPv6有望解决地址问题,NAT仍将长期存在。理解NAT有助于优化网络配置与故障排查。
2025-12-23 16:57:16
1784
原创 什么是 CIDR?一文读懂无类域间路由
CIDR(无类域间路由)是解决传统IP地址分类(A/B/C类)低效问题的关键技术。它通过“IP地址/前缀长度”的灵活划分(如192.168.1.0/24),实现网络位与主机位的动态分配,显著提升地址利用率并减少路由表规模。CIDR支持子网划分和超网聚合,广泛应用于云计算VPC、防火墙规则及路由协议中。例如,192.168.10.0/26提供62个可用IP。作为现代网络设计的核心,CIDR优化了IPv4资源分配和路由效率,成为云架构和运维的基础。
2025-12-23 12:19:05
1203
原创 【Java】Java Stream 什么时候用、怎么用?——一篇写给实战开发者的指南
Java Stream是Java 8引入的声明式数据处理API,用于对数据源进行函数式操作。它不存储数据,采用惰性执行和一次性消费机制。Stream适用于集合的流水线处理(过滤、映射、分组等)、复杂聚合操作以及需要高表达力的业务场景,能显著提升代码可读性。但对于简单循环、需要流程控制或性能极度敏感的代码,传统for循环更合适。核心API包括创建Stream、中间操作(filter/map等)和终止操作(collect/forEach等)。最佳实践建议保持Lambda简洁、避免修改外部变量,并谨慎使用并行流。
2025-12-16 19:15:56
1046
原创 什么是中间件?有哪些中间件?
中间件是位于操作系统与业务应用之间的基础软件,提供通用服务能力(如通信、缓存、消息等),解决系统开发中的复杂性、重复性等问题。其核心价值在于抽象底层技术细节,提升系统稳定性与扩展性。常见类型包括通信类、消息队列、缓存、服务治理等中间件。与框架不同,中间件属于系统级能力,通常独立部署。虽然中间件能显著提升开发效率和系统性能,但也会带来运维复杂度、学习成本等挑战。在现代分布式架构中,中间件已成为连接应用与基础设施的关键桥梁。
2025-12-15 21:53:39
1659
原创 【Java】关于 Java 静态代码块(static block)——原理与用法
本文介绍了Java中的静态代码块,包括其语法、执行时机、使用场景及注意事项。静态代码块在类加载时执行,只执行一次,常用于初始化静态资源。文章对比了静态代码块与构造代码块的区别,分析了多个静态代码块的执行顺序,并探讨了父类与子类中静态代码块的执行优先级。此外,还总结了静态代码块的典型应用场景和常见陷阱,如不能访问实例变量、必须处理异常等。最后从JVM角度解析了静态代码块的底层原理,并整理了面试常见问题。静态代码块是Java类初始化的重要机制,合理使用能有效管理类级别的初始化逻辑。
2025-12-15 16:39:58
1107
原创 深入理解面向对象设计原则:SOLID 原则
SOLID 是面向对象设计的五大核心原则,由 Robert C. Martin 提出,旨在构建更易维护、扩展的系统。其核心思想包括: 单一职责原则(SRP):一个类只负责一个功能 开闭原则(OCP):通过扩展而非修改实现新功能 里氏替换原则(LSP):子类应能完全替代父类 接口隔离原则(ISP):避免强制依赖无用接口 依赖倒置原则(DIP):高层模块依赖抽象而非实现 这些原则共同降低代码耦合度,提高系统灵活性,是构建健壮软件架构的基础。
2025-12-14 13:55:46
1367
原创 【Java】深度理解 Java 中的 MIN_VALUE 和 MAX_VALUE
Java数值类型的MIN_VALUE和MAX_VALUE是包装类中定义的关键常量,表示各类型的取值范围。整型的MIN_VALUE是负数边界,而浮点型的MIN_VALUE却是最小正数(IEEE 754标准设计)。整型取值范围不对称源于补码表示,负数比正数多一个。使用时需特别注意整数溢出问题,如Integer.MAX_VALUE + 1会变成MIN_VALUE。算法中常用这些常量初始化极值或作为哨兵值,而BigInteger等任意精度类型则没有固定上限。理解这些边界值对避免数值计算错误至关重要。
2025-12-13 18:55:33
728
原创 技术考古:去IOE
摘要: “去IOE”是中国IT产业推进自主可控与降本增效的核心战略,旨在替换对IBM小型机、Oracle数据库和EMC存储的依赖,转向开源技术体系。Java开发者在转型中需适配MySQL/PostgreSQL等数据库,利用ShardingSphere、NoSQL技术实现分布式扩展,并通过微服务架构(如Spring Cloud)和容器化提升系统弹性。挑战包括数据迁移风险、稳定性保障及技术选型,未来趋势聚焦云原生、国产化替代(如鲲鹏CPU、达梦数据库)及AI融合。
2025-12-13 14:26:37
1080
原创 深度理解 Java synchronized —— 从原理到实战
本文深入解析Java中synchronized关键字的作用与实现原理。文章首先介绍synchronized的核心功能:保证多线程环境下的互斥访问和可见性。然后详细说明其三种使用方式(实例方法、静态方法、代码块),并分析底层Monitor机制和锁升级过程(偏向锁→轻量级锁→重量级锁)。文章还对比了synchronized与volatile的区别,讨论其可重入性,并给出实战建议。最后通过表格对比synchronized与Lock的特性差异,帮助开发者根据场景选择合适方案。
2025-12-12 18:38:41
1102
原创 深度理解 Java 中的 switch —— 从基础到进阶的完整指南
本文全面介绍Java中的switch语句,涵盖基本语法、支持的数据类型、经典示例及常见问题。主要内容包括:1)switch的基本结构和break的作用;2)不同Java版本支持的数据类型(包括Java 7+的String和枚举);3)经典数字判断示例;4)fall-through现象及其影响;5)Java 14+增强特性(箭头语法和表达式形式);6)多case合并写法;7)使用注意事项;8)与if-else的选择对比。特别强调了Java 14+新特性带来的简洁性和安全性提升,以及在实际开发中的最佳实践。
2025-12-11 21:07:08
764
原创 Java 中的 String, StringBuilder, StringBuffer 区别
本文对比了Java中String、StringBuilder和StringBuffer三种字符串处理类的特性。String是不可变字符串,线程安全但拼接性能差;StringBuilder可变且非线程安全,性能最高;StringBuffer可变且线程安全,性能略低。文章分析了底层原理、使用场景和性能差异,并解答了常见面试问题。总结指出:String适合保存值,StringBuilder用于单线程修改,StringBuffer用于多线程修改。参考资料包括菜鸟教程、廖雪峰官网等技术文档。
2025-12-10 11:36:31
970
原创 Redis 中 ziplist 与 quicklist 解析与对比
Redis列表结构演进与优化:从ziplist到quicklist Redis中的列表(List)支持多种编码方式以适应不同场景需求。早期采用双向链表(linkedlist)或压缩列表(ziplist),3.2版本后引入quicklist作为默认结构。 ziplist通过连续内存存储元素,具有内存紧凑、空间利用率高的优点,适合存储少量小数据,但对修改操作不友好。quicklist采用双向链表+压缩子列表的混合结构,既保留了链表的高效头尾操作,又通过分段ziplist减少了内存碎片,实现了空间与效率的平衡。
2025-12-07 16:21:22
1662
原创 JDK 版本与 Java 版本的关系
Java、JDK和JRE是Java生态的核心概念:Java是编程语言,JRE(Java Runtime Environment)包含JVM和运行库用于执行程序,JDK(Java Development Kit)则包含JRE和开发工具链。JDK版本等同于Java版本(如JDK8=Java8),开发者更关注语言特性(如Java8的Lambda)。Oracle JDK与OpenJDK功能相近,后者是开源标准。自Java9起采用半年发布周期,主流LTS版本包括Java8/11/17/21。
2025-12-06 21:53:00
890
原创 【Java】Java 数组拷贝方法总结:4 种常用方式全面解析
本文总结了Java中数组拷贝的4种常用方式:1)使用for循环实现自定义拷贝;2)System.arraycopy()方法性能最优;3)Arrays.copyOf()/copyOfRange()最常用,支持扩容和部分复制;4)clone()语法最简单但仅适合一维数组。文章通过示例代码对比了各方法的优缺点,并提供了适用场景建议:普通场景用Arrays.copyOf,高性能需求用System.arraycopy,简单复制用clone(),自定义逻辑用for循环。
2025-11-21 11:19:22
901
原创 Java Set 中的常用方法总结
Set是 Java 集合框架(Collection Framework)中最常用的接口之一,具有元素唯一、不允许重复的特性。无论你用HashSetTreeSet,它们都实现了Set接口,因此拥有大量共同的方法。这篇文章将全面总结Java Set 的常用方法并通过示例进行讲解,主要用于日常查询使用。1. 去重操作2. 判断是否包含某元素3. 交集、并集、差集// 并集// 交集// 差集4. 遍历(推荐方式)
2025-11-20 18:34:51
1166
原创 【Java】Java Stream 中的 collect() 方法详解:流最终操作的核心工具
Java Stream API中的collect()方法是重要的终止操作之一,用于将流数据按指定方式收集为集合、字符串、Map或统计结果等。通过Collectors工具类,它支持多种操作,包括转换为List/Set(toList()/toSet())、拼接字符串(joining())、分组(groupingBy())、分区(partitioningBy())以及数值统计(summingInt()/averagingInt()等)。此外,还能通过toMap()构建键值对,或自定义收集逻辑。
2025-11-19 23:32:36
1389
原创 【Java】Java 包装类详解
Java包装类是八种基本数据类型对应的对象类,使其能用于泛型、集合等场景。主要特点包括自动装箱/拆箱、常用值缓存机制(如Integer缓存范围为-128到127),以及提供字符串转换等实用方法。使用时需注意==比较的陷阱、空指针风险及性能消耗。推荐通过valueOf()创建包装类对象,利用缓存提升效率。
2025-11-18 10:37:44
1544
原创 Java mapToInt() 方法详解
Java 8 的 mapToInt() 方法用于将对象流转换为 IntStream,主要应用于数值计算场景。其核心优势包括:支持快速求和(sum())、求平均值(average())、最值计算(max()/min())以及转为基本类型数组(toArray()),同时避免了自动装箱的性能开销。典型用法是通过方法引用(如Person::getAge)提取对象字段为整型流。与map()相比,mapToInt()专为数值操作设计,性能更优。实战案例展示了如何计算商品列表的总价格,体现了其简洁高效的特点。
2025-11-17 14:21:17
852
原创 【Java】Java toArray() 方法详解
toArray()是 Java 集合框架中定义在接口里的一个方法,用于将集合转换为数组。方法返回类型是否安全适用场景toArray()Object[]否(需强转)快速调试或简单场景T[]✅ 是泛型集合转换T[]✅ 推荐Java 11+ 优雅写法。
2025-11-13 13:32:34
1065
原创 【Java】Java String类常用方法
本文系统总结了Java中String类的核心特点与常用方法。文章详细介绍了多种创建方式及30+个常用方法,包括字符串截取、大小写转换、查找替换、分割连接等。通过代码示例演示了trim()、contains()、split()等方法的使用,并对比了String与StringBuilder/StringBuffer的差异,建议单线程用StringBuilder,多线程用StringBuffer。全文涵盖String类从基础特性到实际应用。
2025-11-12 13:22:48
1772
原创 【Java】Java对象相等的判断机制详解 —— == 与 equals() 的真正区别
在Java中,判断对象相等涉及==和equals()两种方式。==比较基本类型的值或引用类型的内存地址,而equals()默认比较引用,但可被重写为内容比较。重写equals()时必须同时重写hashCode(),否则会影响哈希集合的正确性。字符串常量池优化使得相同字面量的==比较为真,但通常建议使用equals()。自定义类需按规范重写方法,并注意包装类缓存范围导致的==陷阱。遵循equals()的五大特性(自反性、对称性等)是正确实现的关键。
2025-11-11 11:15:00
1140
原创 【Java】HashSet_Integer_ num=new HashSet_Integer_(); 与 Set_Integer_ num=new HashSet_Integer_(); 的区别详解
左边是接口,右边是实现” —— 是优雅、灵活、可维护的写法。✅ 代码更抽象、更可扩展;✅ 更符合面向对象设计原则;✅ 是企业级开发的标准写法。
2025-11-10 15:46:01
473
原创 【Java】Java Arrays 工具类详解
Java 数组操作工具类 java.util.Arrays 提供了丰富的静态方法,包含排序(sort()/parallelSort())、查找(binarySearch())、比较(equals()/deepEquals())、复制(copyOf())、填充(fill())等功能。它支持多维数组处理(deepToString())和并行操作(JDK8+),还能转换为Stream流进行函数式编程。使用时需注意:binarySearch()需先排序,asList()返回固定大小列表。简化了数组操作。
2025-11-10 10:02:59
1598
1
原创 【Java】Java 中 @Resource 与 @Autowired 的区别详解
在 Spring 开发中,依赖注入(Dependency Injection, DI)是最核心的特性之一。@Autowired@Resource它们看起来效果相同,但实际上存在底层机制与使用细节的差异。下面将深入剖析两者的区别与最佳实践。
2025-11-09 21:07:42
948
原创 Java computeIfAbsent() 方法详解
在 Java 编程中,我们经常需要在Map中保存一些“键对应的集合”或“键对应的统计信息”。if (!是不是有点啰嗦?这就是今天的主角 ——。是Map接口的一个默认方法super K,?
2025-11-08 22:54:08
870
原创 【Java】Java 打印字符数组的正确姿势
在 Java 编程中,我们经常需要处理字符数组(char[]然而在打印字符数组时,常常会遇到让人疑惑的输出结果。Hello看起来没问题,但如果换成int[]这是为什么呢?
2025-11-07 22:46:42
909
原创 【Java】Java 数组创建与使用详解
数组(Array)是 Java 中最基本的数据结构之一。它用于在内存中存储一组相同类型的元素,并可以通过索引(index)快速访问。无论是学生成绩表、商品价格列表,还是二维矩阵计算,数组都是不可或缺的基础知识。在 Java 中,数组是一种容器对象,用于存储固定数量的同类型值。数组的长度一旦定义,就不能改变。数组中的元素类型相同;数组的长度固定;通过索引(从 0 开始)访问;数组本质上是一个对象(在堆内存中创建)。
2025-11-07 08:56:41
1144
3
C++编程测试题,考察范围:面向对象特性与函数重载机制:基于类继承和多态的代码优化与异常处理技术解析
2025-10-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅