自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 插入排序讲解

插入排序是一种基于整理扑克牌思想的排序算法,通过维护有序区和无序区,逐个将无序区元素插入到有序区的合适位置。其时间复杂度在最好情况下为O(n),最坏和平均情况下为O(n²),空间复杂度为O(1)。相比冒泡排序,插入排序更符合人类整理数据的自然思维,交换次数更少,适合小规模或基本有序的数据。该算法稳定且实现简单,常用于其他高级排序算法的子过程。面试时若被问及基本有序数据的排序选择,插入排序是理想答案。

2025-08-27 10:16:25 464

原创 冒泡排序详解

摘要: 程序员小巫分享了对冒泡排序的思考,认为它虽简单却是算法思维的启蒙。冒泡排序通过相邻元素比较交换,将最大值逐步“冒泡”到数组末尾,时间复杂度最坏O(n²),最好O(n),空间复杂度O(1)。其稳定性与直观性使其成为理解排序的基础,但实际项目中效率低,建议结合快排等高效算法学习。文章包含代码实现、复杂度分析及面试常见问题,强调冒泡排序作为算法入门的重要价值。

2025-08-27 09:55:41 321

原创 Redis事务与锁的顺序抉择:事务里加锁 vs 先锁再事务的“微妙差异”分享

Redis事务与锁的顺序选择对高并发场景有重要影响。先加锁再事务能确保全过程互斥,有效防止数据竞争;而事务内加锁由于延迟执行,无法在事务构建阶段提供保护,可能导致数据不一致。实际开发中推荐采用先锁后事务的标准模式,虽然会延长锁持有时间但能保证强一致性。在订单处理等关键场景中,错误的锁顺序可能引发超卖等问题,需特别注意锁的时效性与原子性操作的正确配合。

2025-08-22 09:48:39 1003

原创 Redis事务与MYSQL事务区别

Redis与MySQL事务对比摘要: Redis事务基于命令队列(MULTI/EXEC),提供简单原子性但缺乏完整ACID支持,适合高性能场景如秒杀。MySQL事务通过undo/redo日志实现完整ACID,支持复杂操作与回滚,但性能较低。关键区别在于Redis无隔离性保证,错误不自动回滚,而MySQL提供强一致性和完善的错误处理机制。实际应用中,Redis适合简单原子操作,MySQL适合需要严格一致性的业务场景,两者可结合使用发挥各自优势。

2025-08-21 15:30:09 895

原创 Redis的String底层原理,为什么高效

Redis的String底层原理远比表面复杂。本文深入分析了Redis String的实现机制,它采用SDS(Simple Dynamic String)结构而非C字符串,具备O(1)长度获取、空间预分配、惰性释放和二进制安全等优势。Redis会根据数据特点自动选择int、embstr或raw三种编码方式,其中int存储整数最省内存,embstr优化短字符串存储。文章还分享了实际使用中的坑点,如数字存储方式对内存的影响,并整理了常见面试问题的解答。通过源码研究和实践验证,揭示了Redis String的高效

2025-08-20 10:45:23 825

原创 同步与异步?从一个卡顿的Java服务说起

同步 vs 异步:从4秒到2秒的性能优化 本文通过一个Java服务接口优化案例,生动演示了同步与异步编程的区别。原接口同步调用两个外部服务(各耗时2秒),总响应时间长达4秒,导致服务器线程资源被大量占用。通过引入Java 8的CompletableFuture进行异步改造,将两个任务并行执行后,总响应时间优化至2秒(取最慢任务耗时)。关键改进在于使用supplyAsync()将任务提交到线程池异步执行,主线程仅需等待最终结果。这种异步模式显著提升了服务吞吐量和资源利用率,展现了异步编程在高并发场景下的优势。

2025-07-21 11:36:17 791

原创 重载与重写?别再死记硬背了!我用“点咖啡”和“做家务”的故事给你讲明白

【摘要】本文用生活化案例解析Java中重载与重写的核心区别。重载(Overload)如同咖啡店点单,在同一个类中方法名相同但参数不同(如orderCoffee()、orderCoffee("拿铁")),提供多种调用方式;重写(Override)则像父子做家务,子类继承父类方法后重新定义实现(如Son重写Father的doChores()方法),体现多态性。两者关键差异在于:重载发生在同类,参数必须不同;重写需跨父子类,参数必须相同。通过"点咖啡"和"做家务&

2025-07-21 11:35:17 1078

原创 致求职中“破防“的你:请别跟别人比,请跟昨天的自己比

摘要: 本文以作者朋友求职受挫的经历为引,结合自身面试失败后重新振作的故事,为求职焦虑者提供心态调整建议:1. 停止无效比较,避免过度关注他人引发精神内耗;2. 客观自我盘点,梳理已有技能与项目价值;3. 理解岗位匹配性,认清"合适比顶尖更重要"的招聘逻辑;4. 建立微小成就体系,通过可完成的小目标重获掌控感。文章强调求职不是与他人的竞赛,而是自我成长的旅程,鼓励读者以"每日进步一点"的积极心态突破困境。(149字)

2025-07-17 16:16:41 562

原创 皮尔逊算法,一文弄清个性化推荐的大腿

本文用生动形象的方式解释了皮尔逊相关系数的核心思想。通过"宽容哥"和"犀利姐"的电影评分案例,说明皮尔逊系数能有效去除用户间的评分尺度差异,专注于捕捉品味的相对趋势。文章详细拆解了公式的分子(偏好度协方差)和分母(归一化处理),并指出该系数的局限性(如对数据稀疏性敏感、仅反映线性关系等)。最后强调理解算法背后的直觉思想比单纯记忆公式更重要,皮尔逊系数的本质是"在比较前先去除个体偏见",这一思想在机器学习中具有广泛适用性。

2025-07-16 15:07:37 940

原创 一文弄清Stream流

Stream流是Java 8引入的函数式编程特性,它通过声明式的链式操作简化集合处理。本文作者结合自身面试经历,深入剖析了Stream的核心优势:1)代码表达力强,逻辑清晰;2)惰性求值机制提升性能;3)支持并行处理。底层基于Spliterator和流水线操作实现,其中Spliterator负责数据拆分和迭代,而流水线操作则构建了一个延迟执行的垂直处理链。虽然Stream提高了代码可读性和开发效率,但在需要精细控制循环或极致性能的场景下,传统for循环仍具有优势。掌握Stream不仅意味着掌握新API,更是

2025-07-16 14:46:54 1202

原创 什么是转移概率矩阵

摘要:转移概率矩阵是马尔可夫链的核心工具,用表格形式展示系统从一个状态转移到另一状态的概率。以用户行为预测为例,通过分析历史行为数据(如浏览、点击、购买等状态间的转移频次),构建概率矩阵进行预测。该方法简单直观、计算高效,但存在无记忆性假设过强、数据稀疏性等局限。适用于短期行为预测场景,对冷启动问题可通过预设默认概率解决,进阶优化可考虑高阶马尔可夫链或深度学习模型。(149字)

2025-07-16 14:21:59 1028

原创 深拷贝和浅拷贝的区别

本文通过一个实际案例深入解析了Java中深拷贝与浅拷贝的区别。作者以自己踩过的线上事故为例,展示了浅拷贝如何导致共享数据被意外修改:当克隆包含可变对象(如List)的类时,浅拷贝仅复制引用而非对象本身,导致原对象和克隆对象仍共享同一数据。为解决此问题,文章详细介绍了深拷贝的实现方法,包括重写clone()方法、使用拷贝构造函数和序列化方式,强调对可变对象必须创建新实例。最后总结何时使用浅拷贝(仅含基本/不可变类型)和何时必须用深拷贝(含可变对象),并推荐拷贝构造函数作为最佳实践。全文通过"遥控器&

2025-07-15 17:02:29 783

原创 为什么Java更建议使用Builder模式编码?

Builder模式优雅地解决了复杂对象构建问题,避免了伸缩构造函数的混乱和JavaBean的不安全性。它通过分离构建过程与对象表示,使用链式调用实现流畅的API,并通过build()方法创建不可变的最终对象。这种方式既保证了对象创建的灵活性,又确保了对象状态的完整性和线程安全性,是构建复杂DTO的理想选择。

2025-07-15 16:09:04 417

原创 ==和equals有什么区别?看不懂隔着网线过来打我

本文通过一个实际案例详细解析了Java中==、equals和hashCode的区别与联系。作者在工作中遇到两个内容相同的用户对象用==比较不相等的问题,发现==比较的是对象内存地址而非内容。随后尝试用equals仍失败,发现默认继承Object类的equals本质上仍是==比较,必须重写该方法。最后使用HashSet时发现仍需重写hashCode,因为哈希集合依赖hashCode定位对象。文章强调Java的铁律:重写equals必须同时重写hashCode,并总结了三个概念的本质区别:==比较身份、equa

2025-07-15 15:57:03 381

原创 SpringBoot相较于Spring有什么优势

摘要: Spring Boot基于Spring框架,通过“约定优于配置”理念,简化了应用搭建、配置和部署流程,显著提升开发效率。其核心优势在于: 自动配置:根据依赖智能配置Spring应用,减少手动配置。 起步依赖:预置兼容的库组合(如spring-boot-starter-web),解决依赖管理难题。 内嵌服务器:集成Tomcat等服务器,无需独立部署,支持快速启动和容器化。 统一配置:通过application.properties灵活调整参数,适应多环境需求。 适用场景:快速构建生产级应用,尤其适合微

2025-07-14 17:40:43 437

原创 计算机实习,你千万不能踩的坑

实习不要踩的雷

2025-07-14 14:15:33 888

原创 基于 Spark MLlib 的推荐系统实现

基于 Spark MLlib 的推荐系统实现 本文解析了使用Spark MLlib构建推荐系统的关键技术与优化方法。首先介绍了Spark MLlib的核心框架演进,重点对比了RDD和DataFrame两种API的特性及其在2025年的最新发展(如深度学习集成、AutoML支持)。其次深入剖析了协同过滤算法原理及前沿趋势(如神经网络协同过滤、图神经网络)。最后提供了优化的Java代码实现,通过分布式操作避免性能瓶颈。全文从框架、算法到实践三个维度,为构建高效推荐系统提供了全面指导。

2025-07-09 17:43:31 777

原创 Spring如何扫描@Component,@Service这些注解的

Spring组件扫描机制解析:通过"城市人口普查"类比,详解@ComponentScan底层原理。核心流程为:1) @ComponentScan划定扫描范围;2) ConfigurationClassPostProcessor协调扫描任务;3) ClassPathBeanDefinitionScanner作为执行者,使用ASM字节码技术(非类加载)高效读取类元数据;4) 根据@Component等注解筛选类,生成BeanDefinition注册表;5) 最终注册到BeanDefiniti

2025-07-09 17:16:44 856

原创 为什么Spring中推荐使用构造函数而不是@Autowired字段注入

摘要:Spring依赖注入方式对比 Spring官方推荐使用构造函数注入而非@Autowired字段注入,主要基于以下优势: 1️⃣ 不可变性:通过final字段确保依赖不可变,提升线程安全性; 2️⃣ 完整性检查:强制在对象创建时提供所有依赖,避免运行时NullPointerException; 3️⃣ 可测试性:无需Spring容器即可实例化类,简化单元测试; 4️⃣ 暴露设计缺陷:直接报错循环依赖问题,促使代码重构。 字段注入虽简洁,但掩盖设计问题,降低可维护性。建议强制依赖用构造函数注入,可选依赖用

2025-07-09 17:15:24 655

原创 一文弄清滑动窗口算法

滑动窗口算法精要 核心思想:通过动态调整窗口边界(左指针left和右指针right)高效解决问题,避免暴力枚举。关键要素包括: 窗口维护:使用集合/哈希存储当前窗口内容 扩展条件:右指针右移,纳入新元素 收缩条件:发现重复时,左指针右移直至窗口合法 结果更新:窗口有效时实时记录最优解 典型应用:求解"无重复字符的最长子串"问题时,通过哈希集合检测重复,时间复杂度优化至O(n)。该模式可扩展至多种边界滑动问题,如最大容积等场景。

2025-07-08 10:12:03 808

原创 注解@Transaction的底层原理

摘要:本文深入解析Spring框架中@Transactional注解与AOP的协同工作原理。通过将事务管理比作"智能保安系统",阐明了AOP如何通过动态代理机制实现事务管理:1) Spring容器创建代理对象拦截方法调用;2) 代理对象在方法执行前后开启/提交/回滚事务;3) 原始业务逻辑在事务保护下执行。同时指出常见失效场景,如方法内部调用、非public方法及异常类型不匹配等情况,这些都与代理机制被绕过有关。理解这套机制有助于开发者正确使用事务注解并避免常见陷阱。

2025-07-08 09:39:12 950

原创 反射的底层原理

Java反射机制的核心是Class对象,它存储了类的所有元数据。调用Method.invoke()时,JVM采用两阶段优化策略:前15次使用JNI本地调用(慢),超过阈值后动态生成字节码实现(快)。这种设计平衡了偶尔反射调用的初始化开销和频繁调用的性能需求,体现了JVM在性能优化上的极致考量。通过sun.reflect.inflationThreshold参数可控制切换时机,展现了典型的"空间换时间"和"延迟优化"思想。

2025-06-23 12:23:05 643

原创 Java反射原理,为什么都在用反射?

摘要:反射是Java的"魔法"特性,通过JVM方法区的Class对象实现运行时动态操作类的能力。虽然存在性能开销,但其在框架开发中价值显著:1)实现终极解耦,支撑Spring等框架的IoC机制;2)构建插件化系统,如IDE扩展功能。各大厂(阿里、腾讯等)的中间件和微服务框架都深度依赖反射。典型应用如数据中台项目通过反射动态实例化插件,实现配置化和扩展性,遵循开闭原则。合理使用反射能以微小性能代价换取系统的高度灵活性。

2025-06-23 12:15:09 800

原创 Java基础八股文 - 面试者心理历程与标准答案

Java基础面试要点:面向对象三大特性(封装、继承、多态)详解,基本数据类型和引用类型区别分析,String不可变设计原理及StringBuilder/StringBuffer对比,equals和hashCode重写契约关系,异常处理机制分类与最佳实践。面试时既要掌握核心概念,又要结合实际代码示例,展现深度理解。(149字)

2025-06-22 16:57:21 917

原创 Spark简介脑图

Apache Spark是一个快速、通用的大规模数据处理框架。它以RDD为核心数据结构,支持内存计算,比Hadoop MapReduce快100倍。Spark生态系统包含Spark SQL、Spark Streaming、MLlib和GraphX四大组件,支持批处理、流处理、机器学习和图计算。其架构包括Driver、Cluster Manager和Executor,通过DAG调度实现高效计算。Spark提供RDD、DataFrame和Dataset三级数据抽象,并采用智能内存管理机制。优化要点包括数据序列化

2025-06-15 15:34:47 659

原创 Spark核心概念与DAG执行原理笔记

本文系统梳理了Spark的核心概念与技术原理,重点解析了RDD特性、DAG执行机制和Stage划分规则。主要内容包括:1) RDD的五大核心特性及操作分类;2) DAG构建流程与窄/宽依赖判断标准;3) 基于Shuffle的Stage边界划分原理;4) Spark作业执行架构及各组件交互;5) 任务并行度与分区关系;6) 广播变量和累加器的应用场景。通过Mermaid图表直观展示了Spark的底层运行机制,为性能优化提供了理论基础,并简要概述了Spark 4.0的新特性发展方向。

2025-06-15 15:30:07 1194

原创 Spark DAG、Stage 划分与 Task 调度底层原理深度剖析

本文深入剖析了Spark的DAG构建与Stage划分机制,以及Task调度的底层原理。主要内容包括:1) DAG构建过程基于RDD的转换操作形成逻辑执行计划,通过行动操作触发计算;2) Stage划分依据RDD依赖类型,窄依赖可管道化执行,宽依赖成为Stage边界;3) Task数量主要由RDD分区数决定,受Shuffle配置、数据源特性等影响。文章详细解析了窄/宽依赖的特点及Stage划分逻辑,并分析了Task并行度的关键影响因素,为Spark性能优化提供理论基础。

2025-06-14 19:27:42 1645 1

原创 SparkUI依赖问题解决方法

摘要:用户遇到Spark UI运行时错误NoClassDefFoundError,提示缺少org.glassfish.jersey.servlet.ServletContainer类。分析表明未包含Jersey Servlet集成模块,需要添加jersey-container-servlet依赖。解决方案:在pom.xml中添加Jersey 3.1.10版本的Servlet容器依赖,并确保jakarta.servlet-api保持5.0.0版本。建议后续检查依赖树解决潜在冲突,并处理SLF4J日志绑定问题。

2025-06-14 18:14:18 1313

原创 解决Spark4.0.0依赖问题

本文针对Apache Spark 4.0.0运行中的常见问题提供了解决方案。主要问题包括POM依赖冲突、JDK版本不兼容(需JDK 17)以及Servlet API兼容性问题(如SingleThreadModel类缺失)。解决方案包括:在pom.xml中明确指定Java 17版本,设置Spark核心和SQL模块为provided范围,排除冲突的Servlet API依赖并手动引入5.0.0版本,配置Maven编译和执行插件,以及添加必要的测试依赖和--add-opens参数解决模块访问限制。这些调整确保了S

2025-06-14 18:08:04 1497

原创 聊聊二手商城的架构:我们如何解决了“立即购买”的库存锁定,以及为什么购物车是个“坑”?

### **聊聊二手商城的架构:我们如何解决了“立即购买”的库存锁定,以及为什么购物车是个“坑”?**大家好,我是[你的名字/昵称]。最近在搞一个二手闲置商城的项目,过程中踩了不少坑,也沉淀了一些思考,想借这个机会和大家聊聊。核心是两个经典问题:1. “立即购买”的并发库存锁定怎么处理才优雅?2. 二手商城,到底需不需要“购物车”这个模块?#### **一、直面“立即购买”的并发难题:从刚性锁定到柔性预扣减**我们项目的初期架构比较直接。用户点击“立即购买”,后端直接在数据库层面锁定商品,

2025-06-09 19:31:26 967

原创 链表-两两交换(Java的三种解法)

本文详细介绍了链表两两交换问题的解法及其应用场景。通过现实案例(如排队、整理书籍)帮助理解链表交换的概念,并分析了三种解法:递归、迭代(带哑节点)和迭代(不带哑节点)。其中,迭代(带哑节点)解法因其空间复杂度低、逻辑清晰,被推荐为最优解。文章还提供了Java代码实现和Mermaid流程图,帮助读者更好地理解迭代解法的步骤。此外,推荐了类似题目(如K个一组翻转链表、反转链表)和相关学习资源,帮助读者深入掌握链表操作的核心知识点。

2025-05-15 12:49:51 1520

原创 二叉树(中序遍历)

这篇文章详细介绍了二叉树中序遍历的多种解法及其应用场景。首先,通过生活中的例子(如家族谱系图、书店图书管理)解释了中序遍历的概念,即“左子树 -> 根节点 -> 右子树”。接着,文章分析了三种解法:递归法(最直观)、迭代法(用栈模拟递归,效率更高)和Morris遍历(空间复杂度O(1),但会修改树结构)。其中,递归法适合初学者,迭代法在实际工程中更常用,而Morris遍历则适合对空间有严格要求的场景。文章还提供了Java代码示例和流程图,帮助读者更好地理解迭代法的实现过程。最后,推荐了类似题目和

2025-05-14 16:18:22 808

原创 RabbitMQ和Seata冲突吗?Seata与Spring中的事务管理冲突吗

答:不冲突,它们可以协同工作,但作用域不同。如何协同? Seata AT 模式下的分支事务实际上是基于本地事务的。当 存在时,Seata 会拦截 管理的本地事务的提交/回滚。结论:同时使用两者是常见且必要的。 保证本地操作的原子性,而 则将这种原子性扩展到分布式环境下的多个参与者。答:冲突!在期望跨服务数据库原子性的场景下,同步调用 Seata AT 模式和异步发送 RabbitMQ 消息是矛盾的。Seata AT 模式的局限性: Seata AT 模式主要设计用于同步调用场景下的数据库操作。它无法管

2025-04-20 18:04:51 1587

原创 自问自答模式(Operation是什么)

后,Swagger/OpenAPI 工具可以自动读取这些元信息并生成可视化文档,让 API 的使用者一目了然、快速上手。包的一个注解,用于给 REST 接口增加文档元数据。是 OpenAPI(Swagger)规范中,来自。

2025-04-17 16:35:46 393

原创 Spring Cache与Redis集成原理

Spring Cache抽象层。调用@Cacheable方法。

2025-04-16 14:51:50 1067

原创 Spring Boot配置属性绑定与自动配置排除详解

命令行参数 > 系统环境变量 > 配置文件。:Spring Boot按优先级加载。:支持JSR-303验证。

2025-04-16 11:18:00 1135

原创 Spring Boot自动配置原理详解

技术组件核心功能工作原理启用自动配置导入AutoConfigurationImportSelector选择要导入的配置实现ImportSelector接口,返回需要导入的类名数组Spring Factories机制配置发现机制通过META-INF/spring.factories文件定位配置类条件注解配置条件判断@ConditionalOnXXX系列根据条件决定是否应用配置自动配置排序控制配置加载顺序通过@AutoConfigureOrder控制优先级属性绑定外部化配置。

2025-04-16 11:16:39 1099

原创 Spring缓存抽象机制

缓存抽象机制Spring

2025-04-16 11:10:17 885

原创 Java数据清洗三剑客:SubString、replace与replaceAll实战指南(基础篇)

掌握这三个方法,足以应对企业开发中80%的基础数据清洗需求。复杂数据建议使用正则表达式工具测试(如RegExr),避免直接在生产环境调试。思考题:如果遇到需要清理的JSON数据中的转义字符,该如何处理?

2025-03-26 16:24:20 790

原创 回文链表(快慢指针+反转链表)——Java实现

给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是,返回true;否则,返回false。[1, 105]

2025-03-20 11:44:25 712

2万字,从底层到企业开发,让我们一起深入学习和了解SpringIoC中的DI和容器

2万字,从底层到企业开发,让我们一起深入学习和了解SpringIoC中的DI和容器

2025-02-15

空空如也

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

TA关注的人

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