自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(1125)
  • 资源 (1)
  • 收藏
  • 关注

原创 终于理解闭包是什么了(含防抖、节流)

闭包简明解析 闭包是函数和其定义时词法环境的组合,核心特点是函数能记住并访问创建时的作用域变量。类比书包:即使放学(函数执行结束),书包(闭包)仍保留着课本(变量)。闭包三大特性:访问外部变量、变量长期存活、数据私有化。 关键应用场景: 封装私有变量(如计数器模块) 回调函数保留上下文(异步请求) 性能优化:防抖(电梯式延迟响应)和节流(水龙头式限流) 防抖与节流通过闭包保存计时器/时间戳,实现高频事件优化。闭包避免了全局变量污染,是JavaScript模块化和状态管理的重要机制。

2025-07-02 05:15:00 870

原创 Java 8 魔法:利用 Function 接口告别冗余代码,打造高效断言神器

Java 8函数式编程实战:利用Function接口优化数据校验 本文展示了如何通过Java 8的Function接口重构传统数据校验逻辑,实现代码精简和复用。以常见的ID有效性检查为例,传统方法会导致大量重复代码。通过定义通用的ensureColumnValueValid方法,利用SFunction参数化校验逻辑,将变化的部分作为参数传递,使相同校验逻辑可复用。该方法接受待校验值、属性提取函数、查询执行器和错误信息模板四个参数,实现了对任意实体类属性的统一校验。改造后的代码显著减少了重复代码量,提升了可读

2025-07-01 05:15:00 614

原创 Spring Boot 封装 MinIO 工具

Spring Boot集成MinIO工具封装 该项目封装了MinIO分布式对象存储的Java工具库,简化了Spring Boot项目中与MinIO的集成。主要特性包括: 通过@EnableAutoMinio注解实现自动配置 支持从配置文件读取MinIO连接参数 提供内容类型枚举(ContentTypeEnums)用于文件上传 包含完善的配置读取组件(MinioProperties) 采用模块化设计,包含注解、配置、连接库等组件 使用方式简单,只需在Spring Boot启动类添加注解并配置MinIO参数即可

2025-06-30 05:15:00 382

原创 快手面试题:一次Insert操作,MySQL的几种Log的写入顺序?

MySQL INSERT操作涉及三种日志的写入顺序: Undo Log(记录事务前状态,用于回滚) Redo Log(prepare)(记录物理变更,确保持久化) Binlog(记录逻辑操作,用于主从复制) Redo Log(commit)(事务最终提交) 关键机制: 采用**两阶段提交(2PC)**确保Redo Log和Binlog一致性 崩溃时根据日志状态决定回滚或恢复 优化建议: 配置innodb_flush_log_at_trx_commit=1和sync_binlog=1确保数据安全 合理使用索引

2025-06-29 05:15:00 1608

原创 从零到百万并发:Java高并发核心编程揭秘,这些坑你踩过几个?

摘要: 《Java高并发编程核心问题解析》从实战角度剖析高并发场景下的典型问题与解决方案。以某电商双11订单服务崩溃为例,揭示线程池无界队列导致内存泄漏的致命错误,提出线程池参数配置黄金法则。通过StampedLock与传统锁的性能对比(10万次读操作耗时减少45%),展示乐观读模式的优化效果。最后介绍使用Arthas工具诊断线程阻塞的具体方法,包括监控方法耗时和追踪锁竞争。文章强调:合理的线程池配置、锁策略选择及监控工具运用是保障高并发系统稳定的关键。

2025-06-28 05:15:00 540

原创 订单超时自动关闭的方案

订单超时自动关闭方案综述 本文总结了四种实现订单超时自动关闭的技术方案: 定时任务轮询数据库:通过定时查询超时订单并更新状态,实现简单但存在精度和延迟问题; Redis过期监听:利用键过期事件通知,但存在延迟和可靠性问题,生产环境不推荐; Redis Zset延迟队列:利用有序集合存储订单和过期时间,内存操作高效但需处理重试机制; 消息队列延迟消息:如RocketMQ的分级延迟队列机制,通过修改消息属性和定时任务实现精准延迟。 每种方案各有优缺点,需根据业务场景、数据规模和可靠性要求进行选择,其中定时任务和

2025-06-27 05:15:00 798

原创 你合并代码用 merge 还是用 rebase?

摘要: Git代码合并时,merge和rebase是两种常用方式。merge保留完整分支历史,适合需要清晰记录分支开发或解决复杂冲突的场景;rebase重写提交历史,使记录更线性整洁,适合个人分支同步或保持干净历史。具体选择需根据需求:保留历史用merge,追求简洁用rebase。两者冲突解决流程类似,均需手动修改后标记完成。实际开发中应灵活选用,兼顾效率与可维护性。(150字)

2025-06-26 05:15:00 764

原创 程序员必看:两个思想优化90%的代码

本文介绍了两个优化代码质量的核心原则:组合函数模式和抽象层次一致性原则(SLAP)。组合函数模式要求公有函数像执行步骤概要,细节封装在私有函数中,使代码更易读和维护。SLAP原则强调函数体内容应在同一抽象层次,避免高层抽象与实现细节混杂。通过代码示例展示了如何应用这些原则重构代码,包括寻找共性、合并重复代码和提升抽象层次等技巧。遵循这些原则能构建金字塔式的代码结构,使代码更简洁、模块化,提升可读性和可维护性。

2025-06-25 05:15:00 313

原创 MySQL 查询慢?项目接口性能优化全攻略(附方案对比)

MySQL查询优化全方案指南 当数据库性能下降时,本文提供了从查询优化到架构升级的完整解决方案:1)基础层优化SQL语句和索引;2)引入Redis等缓存减轻数据库压力;3)复杂查询迁移至Elasticsearch;4)大数据量采用分库分表;5)非核心查询异步化处理。针对不同场景给出了最佳实践组合,如用户详情采用Redis缓存+索引优化,搜索接口使用Elasticsearch+缓存等,全面提升系统响应速度和稳定性。

2025-06-24 05:15:00 379

原创 字节一面:20亿手机号存储选int还是string?varchar还是char?为什么?

摘要: 存储20亿手机号时,应选择String类型而非Int/Long,主要原因包括:1) Int无法存储11位号码,Long会丢失前导零;2) String能保留原始格式,支持国际号码和特殊符号;3) 便于模糊查询。数据库建议用VARCHAR(20)而非VARCHAR(11),以适应国际号、分机号等扩展场景,同时需注意字符集(utf8mb4)、唯一索引、数据清洗和隐私加密。面试考察点在于业务扩展性、数据容错性和全面思考能力。

2025-06-23 05:15:00 1274

原创 工作七年总结:这 7 种设计模式,解决 99% 的 Java 开发场景

Java开发必备的7种设计模式精要 摘要:本文总结了Java开发中最实用的7种设计模式及其典型应用场景。单例模式确保全局唯一实例;工厂模式封装对象创建逻辑;策略模式灵活切换算法;观察者模式实现发布订阅机制。其他三种未展示的模式包括适配器模式(兼容不同接口)、代理模式(控制访问)和模板方法模式(定义算法骨架)。这些模式能解决99%的常见开发问题,提升代码可维护性和扩展性。每种模式均配有典型代码示例,如枚举单例、支付策略等,可直接应用于实际项目开发。

2025-06-22 05:15:00 635

原创 农行1面:Java如何保证线程T1,T2,T3 顺序执行?

摘要 本文介绍了6种在Java中保证线程T1、T2、T3顺序执行的方法: join()方法:通过阻塞当前线程等待目标线程完成 CountDownLatch:使用计数器机制协调线程执行顺序 Semaphore:利用许可证控制线程访问顺序 单线程池:通过ExecutorService确保任务按提交顺序执行 synchronized:使用同步锁保证方法调用顺序 CompletableFuture:利用异步编程的链式调用特性 每种方法都提供了对应的代码示例,展示了如何实现线程的顺序执行控制。这些方案适用于不同场景,

2025-06-21 05:15:00 859

原创 面试官问我:你写代码会复用公共SQL么?

面试中被问及SQL复用实践时,我分享了三种具体实现方法:1) 使用MyBatis的<sql>标签封装公共字段片段,通过<include>引用;2) 结合动态SQL与Java工具类实现分页等通用逻辑复用;3) 通过常量类管理JDBC项目的SQL片段。这些方法能有效减少重复代码、提升可维护性和代码一致性。文章还强调了SQL复用遵循DRY原则的重要意义,为Java后端开发中的SQL管理提供了实用解决方案。

2025-06-20 05:15:00 396

原创 SpringBoot的5种签到打卡实现方案

SpringBoot签到打卡实现方案摘要 本文介绍了基于关系型数据库的签到系统实现方案。系统采用MySQL设计三张核心表:用户表、签到记录表和统计表,其中签到记录表包含用户ID、签到时间、类型等关键字段,并设置唯一约束防止重复签到。代码实现上使用MyBatis-Plus框架,包含实体类设计、Mapper层接口以及Service层的业务逻辑,如检查用户存在性、防止重复签到等。该方案结构清晰,适合中小型应用场景,提供了基础的签到功能实现框架。

2025-06-19 05:15:00 809

原创 服务重启了,如何保证线程池中的数据不丢失?

本文介绍了线程池的作用、原理及常见问题。线程池通过复用线程降低资源消耗,提高响应速度和管理性。线程池工作流程包括任务提交、处理和扩展回收。但使用不当可能导致OOM或数据丢失问题。为防止服务重启时线程池数据丢失,建议将任务数据持久化到数据库,状态标记为"待执行"。通过定时任务查询待执行任务并提交线程池处理,处理成功后更新状态。业务逻辑需做幂等设计,处理失败可自动重试,超过限制次数则标记为失败状态供人工处理。这种机制确保了服务重启时数据不丢失。

2025-06-18 05:15:00 1577

原创 别再背八股文了!大厂真实算法面试考的是这三大思维模式

大厂算法面试考察的核心是思维模式而非题海战术。本文揭示三大关键能力:1)问题抽象能力(将业务需求转化为数学模型);2)渐进式优化思维(从暴力解到最优解的分步优化);3)权衡意识(根据场景选择方案)。通过美团、字节、阿里等真实面试题,展示如何体现工程思维,并附赠大厂高频题分类表等资源。加入知识星球可获得更多实战指导,帮助突破"会做题却通不过面试"的困境。

2025-06-16 10:12:34 365

原创 Java中使用for而不是forEach遍历List的10大理由

摘要: 本文通过基准测试和实例分析,比较了Java中使用for循环与Stream.forEach遍历List的差异,总结了5大优选for循环的理由:1) for循环在小规模数据遍历中性能更优(万元素以内吞吐量提升12%-181%);2) for内存占用更少,GC耗时更短;3) 流程控制更灵活,支持break/continue/return;4) 变量访问不受final限制;5) 异常处理更方便。测试数据显示,for循环在10万元素遍历时性能略低5%,但多数业务场景下仍是更高效的选择。

2025-06-16 05:15:00 630

原创 面试官:GROUP BY和DISTINCT有什么区别?

摘要:MySQL中GROUP BY和DISTINCT都可以处理重复数据,但存在关键区别:DISTINCT用于单纯去重,返回唯一行;GROUP BY用于分组统计,常配合聚合函数使用。DISTINCT只能包含去重列,GROUP BY可展示多列及统计结果。性能方面,使用索引时二者相当,无索引时DISTINCT通常更快,因为早期MySQL版本中GROUP BY会默认排序导致额外开销。实际应用中应根据需求选择:简单去重用DISTINCT,复杂统计用GROUP BY。

2025-06-15 05:15:00 541

原创 15 种超赞的 MyBatis 写法

本文介绍了15种提升MyBatis数据库操作效率的实用技巧,包括:1)优化批量操作使用<foreach>标签;2)动态SQL构建方法;3)多条件分支查询实现;4)SQL语句优化策略;5)自动生成主键配置;6)注解方式简化CRUD;7)高级对象关系映射;8)MyBatis-Plus集成方案。这些方法涵盖了从基础到进阶的MyBatis使用场景,能显著提高开发效率和系统性能。文章通过具体代码示例展示了每种写法的实际应用,为开发者提供了可落地的技术方案。

2025-06-14 05:15:00 542

原创 ThreadLocal被问出了花?一篇彻底搞懂它的终极指南

ThreadLocal被问出了花?一篇彻底搞懂它的终极指南

2025-06-13 07:45:00 896

原创 你真的会用 Java 中的线程池吗?内含多个企业级线程池工具类封装实践

在 Java 多线程编程领域,线程池是一项极为重要的技术。它通过复用已创建的线程,避免频繁创建和销毁线程带来的开销,从而提升系统性能和资源利用率。然而,在实际企业级开发中,许多开发者对线程池的使用仅仅停留在基础层面,未能充分发挥其潜力。本文将深入探讨 Java 线程池的核心原理,并分享企业级线程池工具类的封装实践,帮助你掌握线程池的高级应用。

2025-06-12 19:26:32 898

原创 原理分析:信号量隔离 vs 线程池隔离!

《信号量隔离与线程池隔离的对比分析》 本文深入探讨了两种常见的并发控制策略:信号量隔离和线程池隔离。信号量隔离通过Semaphore限制对共享资源的并发访问数量,适用于数据库连接等场景;线程池隔离则通过为不同任务类型分配独立线程池,实现任务间的资源隔离。文章通过Java代码示例展示了两种隔离方式的具体实现,并对比了它们的特性、适用场景和风险。在实战演示中,作者将两种策略结合使用,分别控制数据库查询的并发量和隔离IO/CPU任务,为高并发系统中的资源管理提供了有效的解决方案。

2025-06-12 05:15:00 804

原创 农银一面:Filter、Interceptor、Spring AOP 的执行顺序

Filter、Interceptor和Spring AOP的执行顺序与区别 在日常开发中,Filter、Interceptor和AOP是三种常用的请求处理技术。Filter是Servlet规范的一部分,工作在Servlet容器层面;Interceptor是Spring MVC框架特有的,工作在Controller层面;AOP则提供更细粒度的切面编程能力。执行顺序为:Filter->Interceptor->AOP->Controller业务逻辑。三者在处理时机、作用范围和使用场景上各有不同

2025-06-11 05:15:00 1964

原创 面试官:你知道select * from users where id > 5 for update时会发生什么吗?

摘要:本文详细介绍了MySQL中的行锁机制,重点分析了在不同查询场景下的加锁行为。对于唯一索引,探讨了等值查询和范围查询的加锁规则;对于非唯一索引,解释了等值查询时的临键锁和间隙锁机制。文章还说明了如何通过performance_schema查看加锁情况,并强调无索引查询会导致表级锁,影响并发性能。通过具体例子,帮助读者深入理解MySQL在不同条件下的锁处理方式。

2025-06-10 05:15:00 956

原创 Java灵魂拷问13个为什么,你都会哪些?

摘要: 本文分析了Java开发中的4个常见问题,包括:1)禁止使用BigDecimal的equals方法进行等值比较,建议改用compareTo;2)避免直接用double构造BigDecimal,推荐使用字符串或valueOf方法;3)不推荐使用Apache BeanUtils进行属性拷贝,建议使用Spring BeanUtils或MapStruct等更高效的工具;4)日期格式化时必须使用y表示年份而非Y,因为两者语义不同,Y可能造成年份计算错误。这些规范有助于提高代码的精度、性能和安全性。

2025-06-09 05:15:00 1122

原创 13个 @Transactional 注解的错误使用场景

摘要: 本文总结了13个常见的@Transactional注解错误使用场景,分为"不必要"和"不生效"两大类。重点包括:1)在无需事务的方法或范围过大的类上滥用注解;2)注解在private/final/static方法上失效;3)同类方法内部调用导致事务失效;4)Bean未被Spring管理等问题。文章还提供了同类调用问题的三种解决方案:独立Service类、自注入和手动获取代理对象。正确使用@Transactional需要注意方法权限、代理机制和Spring管理等

2025-06-07 05:15:00 632

原创 你以为搞懂了 HTTP?那这些 Headers 的妙用你肯定不知道!

咱们先快速过一下基础。HTTP Headers 就是跟在请求行(比如 `GET /index.html HTTP/1.1`)或响应行(比如 `HTTP/1.1 200 OK`)后面的一堆键值对(Key-Value Pairs)。

2025-06-06 05:15:00 496

原创 你真的会用 RedisTemplate 吗?含有企业级 Redis 工具类封装

本文深入探讨了RedisTemplate在企业级应用中的正确使用方法,涵盖四大核心场景:缓存、数据存储、分布式协调和实时数据处理。通过典型业务案例(如电商商品缓存、用户会话存储、分布式锁和秒杀系统)展示了RedisTemplate的具体实现方案,并提供了完整的代码示例。 文章还介绍了封装RedisUtils工具类的必要性,以提升开发效率和代码可读性。重点强调要理解Redis的数据结构与原子性操作,避免误用,才能真正发挥其威力。最后提出了典型场景与核心API的对照表,帮助开发者系统掌握RedisTemplat

2025-06-05 05:15:00 796

原创 面试官:介绍一下 PageHelper 实现分页原理

PageHelper实现分页的原理主要基于Mybatis拦截器机制。在查询前调用startPage方法时,PageHelper会将分页参数存储在ThreadLocal中。其核心是通过实现Mybatis的Interceptor接口,拦截StatementHandler对SQL的预处理过程,自动将原始SQL改写为带有LIMIT的分页查询语句。具体实现步骤为:1)使用ThreadLocal保存分页参数;2)通过Mybatis拦截器机制拦截SQL执行;3)根据ThreadLocal中的参数动态修改SQL语句,添加分

2025-06-04 09:47:05 922

原创 SpringBoot中13种设计模式应用案例

本文介绍了SpringBoot中三种经典设计模式的应用案例: 单例模式 - Spring默认以单例方式管理Bean,确保全局唯一实例,减少内存占用并简化共享资源管理。 工厂方法模式 - 通过BeanFactory和自定义工厂类(如PaymentProcessorFactory)实现对象创建逻辑的封装,支持松耦合和扩展性。 抽象工厂模式 - 在多环境配置和数据源场景中,通过抽象工厂(如DatabaseFactory)创建一系列相关对象,实现不同数据库产品的无缝切换。 这些模式在SpringBoot中提供了灵活

2025-06-04 05:15:00 882

原创 饭票、图书馆、GC:这样理解 Java 引用,谁还不会?

饭票、图书馆、GC:这样理解 Java 引用,谁还不会?

2025-06-03 19:18:03 660

原创 Java并发编程:守护线程

摘要:Java守护线程解析 Java守护线程(Daemon Thread)是特殊的后台线程,其核心特性是:当JVM中只剩守护线程时,虚拟机将自动退出。与普通线程不同,守护线程会随主线程结束而强制终止,即使正在执行任务(如无限循环)。典型应用场景包括垃圾回收、日志记录等后台服务。通过Thread.setDaemon(true)可设置守护线程,需注意其任务应设计为可中断的,避免影响程序稳定性。守护线程机制为Java提供了高效的后台任务支持方案。

2025-06-01 05:15:00 407

原创 token是用来鉴权的,session是用来干什么的?

JWT用于无状态用户认证和授权,而Session作为补充安全层提供额外保护。JWT实现无状态认证便于系统扩展,Session则用于管理Token生命周期、防止滥用、支持主动注销和状态追踪。两者结合既保持了JWT的无状态优势,又通过Session增强了安全性。代码示例展示了登录时同时生成JWT和创建Session,并在验证时双重检查的流程。这种混合模式平衡了安全性与扩展性需求。

2025-05-31 05:15:00 426

原创 一招搞定Java线程池炸弹,系统吞吐量暴增10倍!

文章介绍了一个解决Java线程池问题的监控工具,通过该工具可以有效提升系统吞吐量。文章首先描述了系统响应慢的问题,经过排查发现是线程池被占满导致任务队列堵塞。为了解决这一问题,作者开发了一款线程池监控工具,并展示了其效果。该工具能够实时监控线程池的关键指标,如活跃线程数、队列使用率、任务完成率等,并支持告警和自动调整线程池参数。文章还提供了核心代码实现,展示了如何注册线程池、收集统计数据以及进行趋势分析和自动调整。该工具已在公司内部推广,显著提升了系统性能。

2025-05-29 05:15:00 498

原创 用deepseek写了一个简单的叫号系统

要实现一个基于 ThinkPHP 6.1 的排队叫号系统,我们可以按照以下步骤进行开发。系统将使用 Redis 作为队列存储,WebSocket 实现实时推送,并提供 API 接口供用户和管理员操作。

2025-05-28 05:15:00 851

原创 面试复盘:Java为什么有这么多“O”?——从请求链路看清楚

在Java开发中,常见的“O”如PO、DTO、VO、BO等,各自承担不同的职责,确保代码结构清晰、职责分离。以Spring Boot + MyBatis的用户查询接口为例,请求链路如下:Controller层:接收前端请求,使用DTO(Data Transfer Object)封装参数,便于校验和扩展。Service层:将DTO转换为BO(Business Object),进行业务逻辑处理,如计算注册天数。DAO层:通过Mapper查询数据库,返回PO

2025-05-27 05:15:00 846

原创 SpringBoot中内置的49个常用工具类

SpringBoot内置了49个常用工具类,涵盖了字符串处理、集合操作、反射、I/O等多个领域。字符串处理工具类如StringUtils提供了空值检查、文本内容判断、字符串分割等功能;AntPathMatcher用于路径匹配和变量提取;PatternMatchUtils支持简单的模式匹配。集合工具类如CollectionUtils提供了集合的空值检查、交集计算等操作;MultiValueMap支持多值映射。反射工具类如ReflectionUtils和ClassUtils简化了字段访问、方法调用和类信息获取。

2025-05-26 05:15:00 360

原创 掌握 Java 枚举,提升代码质量

Java 枚举是一种强大的工具,能够提升代码的可读性和可维护性。通过enum关键字定义枚举,可以为常量添加属性和方法,增强其功能。枚举支持遍历、条件判断和静态方法,适用于多种设计模式,如策略模式、工厂模式、观察者模式、状态模式和单例模式。最佳实践包括使用枚举代替常量、为每个常量提供具体行为以及避免依赖外部状态。合理使用枚举可以有效提高代码质量,减少错误,并增强代码的扩展性。

2025-05-25 05:15:00 1051

原创 这9个工具库让我的Java开发效率提升了80%

在Java开发中,使用一些高效的工具库可以显著提升开发效率。本文介绍了几个常用的工具类,包括Collections、CollectionUtils和Lists。Collections类提供了排序、获取最大/最小值、返回空集合、转换为不可修改集合和线程安全集合等功能。CollectionUtils类则提供了检查集合是否为空、对两个集合进行交集、并集等操作的方法。Lists类则提供了快速初始化集合、笛卡尔积、分割集合和流处理等功能。这些工具类能够帮助开发者避免重复编写代码,提升开发效率。

2025-05-24 05:15:00 768

原创 面试官:代码里System.out.println比较多,该怎么办?

在Java开发中,System.out.println常用于调试和输出信息,但随着项目复杂度的增加,过多的使用会带来性能、维护和安全问题。面试中,面试官可能会询问如何处理这一问题。解决方案包括引入日志框架(如Log4j、SLF4J、Logback)来替代System.out.println,通过代码审查和重构减少不必要的打印语句,以及使用静态代码分析工具(如SonarQube、Checkstyle、PMD)自动检测和规范代码。这些方法不仅能提升代码质量,还能优化日志管理,增强项目的可维护性和安全性。

2025-05-23 05:15:00 796

day01_项目介绍和工程搭建.md

day01_项目介绍和工程搭建.md

2021-09-04

空空如也

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

TA关注的人

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