自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(91)
  • 收藏
  • 关注

原创 堆排序(详解版)

堆结构及其核心操作解析 摘要: 堆是一种基于完全二叉树实现的逻辑结构,物理上用数组存储,分为大根堆(父节点≥子节点)和小根堆(父节点≤子节点)。其核心优势在于高效获取极值(O(1)时间),通过局部有序性(仅父子节点有序)避免全局排序的开销。关键操作包括:1)建堆:从无序数组自底向上调整,时间复杂度O(n);2)插入调整:新元素置于末尾后向上调整,维护堆序性;3)删除调整:替换根节点后向下调整。典型应用包括堆排序(O(nlogn))、优先队列(动态极值获取)及Top K问题(O(nlogK))。

2025-08-27 22:28:06 1055

原创 树的遍历(图解版)

本文回顾了树的基本概念、分类、核心操作及应用场景。首先介绍了树的非线性层次化结构和相关术语(节点、边、层次、深度等),然后根据结构特征将树分为普通树、二叉树和多叉树,重点讲解了二叉树的特殊类型(满二叉树、完全二叉树、平衡二叉树)。接着详细阐述了树的遍历(深度优先和广度优先)、插入、删除和查找操作,并分析了树在数据存储、字符串处理、算法计算等领域的典型应用。最后通过与其他数据结构的对比,总结了树在表达层级关系和高效率操作方面的优势。文章还提供了二叉树前序遍历的Java代码示例和栈执行过程说明。

2025-08-26 20:51:32 918

原创 双指针(一种算法思想)

摘要:本文介绍了双指针作为一种解决算法问题的思想,而非具体算法。通过力扣2697题(将字符串转为回文串的最小操作)展示了双指针的应用:使用左右指针遍历字符串两端,比较并修改字符使其对称。文章指出双指针是暴力解法的优化,适合算法入门学习。示例代码演示了如何用双指针高效解决问题,并建议进阶学习者参考相关贪心算法文章。全文强调双指针的核心在于用两个变量在线性结构上进行遍历和比较。

2025-08-25 20:21:26 545

原创 位运算(算法题解)

文章摘要:位运算虽非算法,但作为高效工具在算法设计中广泛应用。本文以判断2的幂次方为例,通过分析二进制特征,提出利用n & (n-1)的位运算技巧实现无循环/递归的解法。核心思路是2的幂次方数二进制仅含一个1,减1后与原数按位与结果为0。最终给出简洁的Java代码实现,展示了位运算在算法优化中的巧妙应用。

2025-08-24 18:23:26 497

原创 广度优先搜索(BFS)

本文介绍了广度优先搜索(BFS)的概念及其在二叉树层序遍历中的应用。BFS是一种按层遍历的算法,使用队列实现"先进先出"的特性。文章通过LeetCode第102题展示了BFS的实战应用:利用队列存储当前层的节点,依次处理并收集下一层节点,最终返回各层节点值的列表。解题关键在于识别BFS适用场景,并正确使用队列存储待处理的节点。

2025-08-23 23:15:25 358

原创 深度优先搜索(DFS)

深度优先搜索(DFS)是一种图与树的遍历算法,采用不撞南墙不回头的策略,优先沿一条路径深入探索直到尽头,再回溯寻找其他路径。DFS可通过递归(隐式栈)或显式栈实现,适用于树形结构和深度较小的图。以LeetCode 112题为例,题目要求在二叉树中判断是否存在根节点到叶子节点的路径和等于目标值。通过递归实现DFS,每次减去当前节点值,若到达叶子节点时剩余值为0则返回true。递归利用短路特性提前终止搜索,优化效率。

2025-08-23 22:00:43 1294

原创 SPI机制

SPI(服务提供者接口)是Java提供的一种服务发现机制,实现接口与实现的解耦,支持框架扩展。其核心原理是:1)定义标准接口;2)提供实现类;3)通过配置文件暴露实现;4)运行时动态加载。与API不同,SPI是消费者定义规范、生产者提供实现,常用于数据库驱动、日志系统等场景。SPI与依赖注入、插件化等概念相关但不同,主要解决服务发现而非依赖管理问题。代码示例展示了如何通过ServiceLoader加载日志服务的不同实现(控制台/文件),需在META-INF/services/下配置实现类。

2025-08-23 13:14:22 989

原创 动态规划算法

本文介绍了动态规划思想及其在爬楼梯问题中的应用。通过分析发现爬楼梯方案数符合斐波那契数列规律,初始采用递归解法但存在重复计算问题。随后使用哈希表记忆已计算结果,实现空间换时间的优化。最后将递归转换为循环解法,指出循环具有空间复杂度低、避免栈溢出和效率高的优势,但强调递归在树遍历等场景下仍更适用。两种解法均体现了动态规划避免重复计算的核心思想。

2025-08-21 22:52:08 370

原创 贪心算法(讲解+真题)

其实就是一句话:在间距缩短的必然条件下,贪更大的柱子高度,从而贪更大的面积;

2025-08-21 16:01:12 717

原创 Java二进制运算符(超详细+扩展)

本文系统梳理了Java中运算符与数据存储的核心知识,包括计算机存储单元、原码/反码/补码/掩码的原理、基本数据类型特性及整数存储方式。重点解析了补码作为计算机整数存储标准的原因,以及位运算符直接操作补码的机制。通过详细示例展示了二进制编码转换过程,帮助读者深入理解Java底层数据表示和位运算逻辑,为阅读源码和性能优化提供理论基础。

2025-08-19 18:43:06 1242

原创 Java模块化(详解)

Java 9引入的JPMS模块化系统是Java平台自泛型以来最重要的架构变革。该系统通过模块(Module)重构了Java平台,解决了类路径依赖混乱、JDK内部API滥用等问题。

2025-08-18 18:53:22 1996

原创 自定义Starter(3x版本)

Spring Boot Starter 是简化依赖管理和配置的模块化机制,本文探讨了自定义 Starter 的方式以及在自定义Starter过程的一些注意事项。

2025-08-17 22:00:59 863

原创 浮点计算问题以及BigDecimal使用

本文探讨了浮点数运算中的精度丢失问题及其解决方案。通过示例代码展示了Java中Double和Float类型在计算时产生的精度误差(如0.1+0.2≠0.3),并指出这种误差源于二进制存储特性。针对金融等精度敏感场景,文章推荐使用BigDecimal类避免此类问题。

2025-08-17 15:03:37 1033

原创 计算机小数存储原理

本文介绍了计算机中浮点数的存储标准IEEE 754及其实现原理。IEEE 754是现代计算机存储小数的通用标准,采用符号位+指数位+尾数位的结构,分为32位单精度(float)和64位双精度(double)。文章详细讲解了浮点数的二进制转换方法、存储格式以及精度丢失问题。

2025-08-17 14:34:52 909

原创 MySQL数据库的JOIN查询优化

文章摘要:本文探讨了MySQL多表JOIN操作的性能问题及优化方案。通过构建包含5万用户、50万订单、100商品和百万订单详情的测试数据库,作者验证了阿里开发规范中关于JOIN限制的合理性。重点分析了数据库优化器局限性、JOIN算法性能瓶颈(nested loop/block nested loop/index nested loop)、分库分表架构影响等核心问题,并指出数据类型一致性和索引对性能的关键作用。文章还揭示了临时表生成、数据分布不均、数据库参数配置等潜在性能影响因素。

2025-07-22 21:46:08 771

原创 JUC并发编程(二)

围绕 Java 中 `synchronized` 关键字,介绍其基于对象头(含 `Mark Word`、`Klass Word`)和 Monitor 的实现原理,轻量级锁(多线程错开时 CAS 操作获取)、重量级锁等状态及升级机制,以及自旋(Java 6 后自适应)、偏向锁(JDK 15+ 过时)、锁消除(基于逃逸分析)等优化策略。

2025-05-29 18:24:23 656

原创 JDK16:ZGC并发线程处理改进

JDK 16对ZGC垃圾收集器进行了重要优化,新增了并发线程栈处理功能,通过线程栈快照和协作式处理机制,消除了STW阶段的线程扫描暂停,将最大停顿时间缩短至1ms以下。该改进显著提升了ZGC在低延迟场景下的性能,特别适合大内存、多核环境的应用。ZGC在JDK 16中正式成为非实验性特性,可通过简单参数直接启用,进一步巩固了其作为Java低延迟垃圾收集解决方案的地位。

2025-05-27 23:59:54 1031

原创 JDK17:向量API(第二次孵化)

Java向量API在JDK 17中迎来第二次孵化(JEP 414),主要改进了API稳定性和性能。关键更新包括优化的方法命名、增强的自动向量化能力(支持ARM NEON等架构),以及新增的向量掩码和重组操作。相比JDK 16,JDK 17提供更完整的条件计算支持,同时改进了内存访问模式。该API仍处于孵化阶段,需通过--add-modules jdk.incubator.vector启用。后续JDK 20将正式标准化该API。

2025-05-27 23:53:43 574

原创 JDK9:改进钻石操作符

Java 9改进了钻石操作符(<>),允许在匿名类中使用泛型类型推断。此前版本中,匿名类必须显式指定类型参数。Java 9会根据上下文自动推断类型,简化了代码并提高可读性。该特性适用于扩展泛型类并实现匿名类的场景,但仅能在可推断类型的条件下使用,与Java 10+的var配合时也可自动推断类型。这一改进不影响旧版本中钻石操作符的原有用法,主要优化了匿名类的泛型声明方式。

2025-05-27 23:51:33 497

原创 JDK8:类型注解

Java 8的类型注解扩展了注解的使用范围,允许在变量声明、泛型参数、强制类型转换等任何类型使用处添加注解。该特性通过@Target元注解新增的TYPE_USE和TYPE_PARAMETER值实现,需配合静态分析工具如Checker Framework才能发挥作用。类型注解不影响运行时性能,但能增强编译时类型检查,提升代码质量。通过反射可获取类型注解信息,为Java类型系统提供了更强大的支持。

2025-05-27 23:48:56 424

原创 JDK8:base64编解码

Java 8 新增了java.util.Base64类,提供标准Base64编码/解码功能。它支持三种编码方式:基本编码(标准Base64)、URL安全编码(不含特殊字符)和MIME编码(带换行)。通过简单API如getEncoder()和getUrlEncoder()即可实现字符串和二进制数据的编解码,比第三方库更高效。特别适合处理URL参数、邮件附件和图片等场景。注意URL安全编码会替换特殊字符并省略填充符,确保兼容性。Java 8之前版本需使用Apache Commons等第三方库实现类似功能。

2025-05-27 23:47:17 377

原创 JDK16:向量API(第一次孵化)

Java向量API首次在JDK 16作为孵化模块(JEP 338)引入,支持SIMD并行计算,提供向量运算(如add/multiply)和6种基元类型的数据操作。开发者需通过--add-modules启用jdk.incubator.vector包,示例代码展示了基于DoubleVector的数组并行加法。该版本存在孵化API变动风险、强制模块参数等限制,后续JDK 20将其标准化为java.lang.vector,JDK 21提供LTS支持。建议生产环境使用JDK 21+以获得稳定功能。

2025-05-27 23:36:42 376

原创 JDK17:模式匹配的 Swith 表达式

Java 17+引入了模式匹配的switch表达式,允许直接在switch中进行类型检查和转换,简化代码结构。支持类型模式匹配、守卫条件(带if的匹配)和密封类覆盖检查,需注意变量作用域、空值处理和匹配顺序。该特性减少了类型转换样板代码,使多类型分支处理更简洁安全,推荐在Java 17及以上版本使用。

2025-05-27 23:26:56 534

原创 JUC并发编程(一)

本文围绕 Java 线程展开,涵盖创建、查看、状态、API 及面试题等内容。创建线程有继承 `Thread` 类、实现 `Runnable` 与 `Callable` 接口、使用线程池四种方式。可通过命令或工具查看进程和线程。线程有 6 种状态,包括新建、可运行等。介绍了 `run()`、`start()`、`sleep()` 等常见 API 的用法与区别。还列举了进程和线程区别、线程池参数及工作流程等面试题,涉及线程相关命令、状态转换、方法对比等知识,对理解和掌握 Java 线程编程有重要参考价值。

2025-05-27 18:15:56 1240

原创 JDK 17:封闭类转正

JDK 17正式引入密封类特性(JEP 409)。该特性最初在JDK 15预览,经过JDK 16改进后定型。密封类通过sealed关键字和permits子句精确控制继承层次,仅允许特定子类扩展,有效防止意外继承。

2025-05-26 20:41:16 260

原创 JDK17:增强的伪随机数生成器

JDK 17引入了增强的伪随机数生成器(JEP 356),对Java随机数框架进行了重大升级。新特性提供了统一接口RandomGenerator,支持多种算法(如Xoshiro256++、LXM),明确区分普通与密码学安全场景,并通过工厂方法灵活创建实例。相较于传统Random和SecureRandom,新API在性能、算法多样性和线程安全方面均有提升,尤其适合游戏开发、密码学和模拟计算等场景。

2025-05-26 20:38:06 634

原创 JDK16:弹性元空间

摘要: JDK 16引入的弹性元空间(JEP 387)优化了元空间内存管理,解决类卸载后内存释放延迟、碎片化及配置复杂等问题。核心改进包括: 主动内存回收:类卸载后更快返还内存至系统 减少碎片化:优化分配算法提升利用率 简化配置:降低对MaxMetaspaceSize等参数的依赖 性能提升:减少GC压力,长期运行应用内存占用降低达70% 适用于动态类加载场景(如微服务),默认配置即可高效运行,显著减少手动调优需求。建议升级JDK 16+以优化内存管理。

2025-05-26 20:33:03 808

原创 JDK15:移除Nashorn JavaScript脚本引擎

JDK 15移除了Nashorn JavaScript引擎,主要原因是其技术架构过时、性能不足且维护成本高。Nashorn仅支持ES5.1标准,难以兼容现代JavaScript特性,在处理复杂代码时性能落后于V8等引擎。随着Node.js成为主流和GraalVM提供更优替代方案,Nashorn逐渐失去价值。官方建议迁移至GraalVM JavaScript引擎或Node.js集成方案,以获得更好的性能、安全性和现代JS特性支持。这一调整反映了Java平台向专业化、高性能技术演进的趋势。

2025-05-26 20:26:44 1127

原创 JDK15:准备禁用和废除偏向锁

JDK 15废弃并默认禁用偏向锁(Biased Locking),这是Java锁机制的重要调整。偏向锁原为优化单线程性能而生,但随着多线程应用普及,其维护成本和撤销开销已超过收益。现代高并发场景下,偏向锁频繁撤销反而降低性能,且与JVM其他优化冲突。禁用后,锁升级简化为无锁→轻量级→重量级。开发者需检查现有参数,优化同步代码,并进行性能测试。大多数应用可接受默认配置,特殊场景需评估手动启用的必要性。这一变更反映了Java对现代并发需求的适应。

2025-05-26 20:24:28 1107

原创 JDK15:文本块转正

JDK 15正式引入文本块(Text Blocks)特性,简化了多行字符串的处理。相比传统方式,文本块减少了转义字符需求,自动处理缩进,显著提升代码可读性。其核心优势包括:更简洁的多行字符串表示、更少的转义字符以及智能的缩进处理。适用于SQL查询、JSON/XML模板等场景,性能与传统字符串相当。文本块编译后转为普通字符串,完全兼容现有String类方法,并能与String.format结合使用。这一特性为处理格式化文本提供了更优雅的解决方案,建议在新项目中优先采用。

2025-05-26 20:22:41 500

原创 JDK15:封闭类

Java 15引入的封闭类(Sealed Classes)通过sealed修饰符和permits子句精确控制继承关系,限定只有特定子类可扩展父类。封闭类需配合final、sealed或non-sealed修饰子类,强化类型安全,支持模式匹配的完整性检查,适用于领域模型和框架设计。相比抽象类和最终类,封闭类提供受限继承能力,确保编译期类型安全,是Java类型系统的重要增强。

2025-05-26 20:11:19 457

原创 JDK15:隐藏类

JDK 15引入了隐藏类(JEP 371),为动态编程场景提供重要支持。隐藏类通过JVM内部API动态创建,对静态类型系统不可见,主要用于框架反射、动态代理和脚本引擎等场景。其核心优势包括:生命周期与创建者绑定避免元空间泄漏、紧凑数据结构提升性能、通过访问限制增强安全性。隐藏类通过Lookup.defineHiddenClass方法创建,相比传统动态类,具有更优的内存管理、安全性和调用效率。典型应用包括Spring AOP代理和脚本引擎,但存在类加载器限制和调试支持不足等约束。

2025-05-26 20:05:25 557

原创 JDK14:新增jpackage工具

JDK 14引入的jpackage工具(JEP 343)可打包Java应用及其依赖、JRE和启动脚本为平台特定安装程序,支持Windows(.exe/.msi)、macOS(.dmg/.pkg)和Linux(.deb/.rpm)格式。它支持模块化和非模块化应用,可自定义安装参数、图标和版本信息,并自动生成卸载程序。相比传统部署方式,jpackage无需用户安装JRE,简化了依赖管理和安装流程。需注意不同平台的工具依赖,可通过jlink优化JRE大小。该工具显著提升了Java应用的分发体验。

2025-05-26 20:02:55 1177

原创 JDK14:移除CMS垃圾回收器

JDK 14正式移除了CMS垃圾回收器(JEP 363),标志着Java垃圾回收策略的重大转变。CMS作为低停顿回收器曾在JDK 5时代广泛应用,但存在内存碎片、并发模式失败等问题。自JDK 9宣布弃用后,建议开发者转向G1、ZGC或Shenandoah等现代GC。G1适合中等堆内存场景,ZGC适用于大内存低延迟需求。迁移时应评估当前GC性能,优先考虑G1,大内存场景可选择ZGC,并优化应用代码减少大对象分配。CMS的移除推动了Java向更高效垃圾回收方向发展。

2025-05-26 20:01:13 893

原创 JDK14:ZGC支持

JDK 14 正式将 ZGC 垃圾收集器转为生产可用,其核心特性包括:支持最大4TB堆内存、10ms以内的极低停顿时间、分代收集优化(年轻代复制算法/老年代标记-压缩)以及NUMA架构优化。JDK 14的改进涵盖分代收集启用、元空间管理优化和内存分配效率提升,适合大内存、低延迟场景如实时系统和云原生应用。通过参数-XX:+UseZGC启用,相比G1等收集器,ZGC在大内存和低延迟场景表现更优,标志着Java在内存管理上的重要进展。

2025-05-26 19:59:31 986

原创 JDK14:switch增强正式转正

JDK 14正式引入了增强的Switch表达式(JEP 361),解决了传统Switch语句的多个痛点。新特性包括:1)使用箭头语法(->)替代break,避免fall-through错误;2)支持直接作为表达式返回值;3)可用yield返回复杂逻辑结果;4)允许合并多个case值。相比传统冗长的break语法,新Switch语法更简洁,减少了错误风险,提升了代码表达力。该特性经历了JDK 12/13的预览阶段,最终在JDK 14成为标准功能,推荐使用。

2025-05-26 19:57:42 325

原创 JDK14:空指针异常精准定位

JDK 14引入了空指针异常精准提示功能(JEP 358),显著改善了NullPointerException的错误信息。与旧版本仅显示异常位置不同,新特性会明确指出导致异常的null变量及其操作上下文,如"user.getName()因为user为null"。该功能通过字节码增强实现,默认启用,可快速定位复杂表达式中的空指针问题,大幅提升调试效率。禁用需使用-XX:-ShowCodeDetailsInExceptionMessages参数。这是Java在错误诊断方面的重要改进。

2025-05-26 19:55:23 224

原创 JDK13:动态 CDS 存档

动态CDS存档是JDK 13引入的优化技术,扩展了静态CDS功能,允许在应用运行时自动捕获类数据并生成共享存档(.jsa文件)。相比静态CDS仅支持JDK核心类,动态CDS可包含应用类和第三方库类,通过运行时记录、退出时存档的机制实现分层加载(依赖静态CDS为基)。优势包括提升启动速度、降低内存占用,且无需手动配置类依赖。使用方法简单,通过-XX:ArchiveClassesAtExit生成存档,-XX:SharedArchiveFile调用存档。需注意版本兼容性、首次生成开销等限制,该特性特别适用于微服务

2025-05-26 19:45:06 673

原创 JDK 13:FileSystems增强

JDK 13在FileSystems类中新增了三个newFileSystem(Path)方法,用于简化将压缩文件(如ZIP/JAR)或自定义格式文件作为文件系统访问的操作。这些方法支持只读/读写模式,可配置环境参数,并允许指定类加载器加载自定义文件系统提供者。典型应用包括直接遍历ZIP文件内容、修改压缩包,以及集成第三方文件系统(如HDFS)。优势在于统一API接口和自动资源管理,但需注意性能影响和线程安全限制。该方法依赖于已注册的文件系统提供者,默认支持ZIP/JAR等格式。

2025-05-26 19:10:34 481

原创 JDK13:Socket API重构

JDK 13重构了Java Socket API(JEP 353),主要改进包括:废弃旧实现,引入构建器模式简化Socket创建;增强异步编程支持,集成CompletableFuture;新增Unix域套接字支持;优化SSL/TLS配置;并针对性能进行多项优化,如零拷贝和减少锁竞争。新API提供了更简洁、高效和现代化的网络编程方式,建议逐步迁移至新API以充分利用这些改进。

2025-05-25 22:19:23 441

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除