自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 泛型中的T、E、K、V、?

首先,我们要明确一个概念,T,E,K,V是类型参数(Type Parameter),而?- 类型不安全: 可以存入任何类型(String、Integer等),但取出时容易忘记转换或转换错误 - 繁琐的强制转换: 每次取出都要手动cast - 运行时错误: 如果类型转换错了,只能在运行时才发现(抛出ClassCastException)表示“某种类型是 T 或 T 的子类”,适合生产者/只读场景(PECS 原则中的 Producer)。读(生产者)用 extends,写(消费者)用 super。

2025-11-23 21:22:42 553

原创 Guava TreeRangeSet:区间运算的数学之美!

TreeRangeSet是Guava中基于红黑树实现的区间集合。它专门用于处理区间的并集、交集、补集等数学运算,让复杂的区间逻辑变得简单直观。简单说,它就像是给区间运算装上了"数学大脑"!

2025-11-02 22:28:29 280

原创 IDEA Debug高阶技巧

为了定位到具体哪一条数据出了问题,我们需要按F9或点击箭头处按钮直到循环到错误数据,案例中共6条数据,即使最后一条数据错误,我们也只需要按五次即可发现问题数据,但是在正式/测试环境中,你无法确认从数据库中查询到多少条数据,假如是1000条,接下来很长一段时间你将被这个问题所困扰。Spring Boot项目在启动时,会加载所有被标注的元数据,此时我们自定义了一个Bean的类型叫a,我们可以在BeanFactoryUtils对应的加载方法中添加条件断点,这样就可以更快的查看我们自定义的Bean的加载逻辑。

2025-10-26 19:21:35 780

原创 Apache Commons IO:文件流处理利器,让Java IO操作更简单

两者对比,代码量减少 80%,且FileUtils内部做了大量优化:自动处理缓冲区大小、支持大文件断点续传、完善的异常封装。这就是 Commons IO 的核心价值 —— 将文件操作的复杂细节封装成直观的 API,让开发者专注于业务逻辑。处理文件名和路径时,不同操作系统的差异(如 Windows 用\,Linux 用/)是常见陷阱。FilenameUtils提供了跨平台的文件名处理方法。处理目录时无需担心子文件或多级目录的问题,forceMkdir比 JDK 的mkdirs()更健壮,会自动处理权限问题。

2025-10-12 21:43:38 784

原创 SpringBoot配置优化:Tomcat+数据库+缓存+日志全场景教程

用@Async注解实现异步任务时,Spring Boot默认用SimpleAsyncTaskExecutor——这个执行器“每次都新创建线程”,高并发时会生成大量线程,导致“系统资源耗尽”,就像“每次办事都找新临时工,人太多管理不过来”。文件没变则用缓存,兼顾“快”和“新”。Spring Boot默认用HikariCP作为数据库连接池(性能最优的连接池之一),但默认最大连接数仅10,若项目并发高,会出现“数据库连接不够用,请求卡壳”的情况,就像“餐厅只有10个服务员,客人多了要排队”。

2025-09-21 20:14:06 1279

原创 Hutool CompareUtil搞定中文排序、自定义顺序全支持

做开发时总被 “比较排序” 折磨:比较两个日期,一个是 null 直接报 NullPointerException,查了半天才定位到中文姓名排序,按默认 String 比较变成 “张三” 排在 “李四” 后面(按 ASCII 码),完全不符合拼音习惯商品状态要按 “待支付> 已支付 > 已取消” 自定义顺序排序,得写十几行 Comparator,逻辑绕来绕去其实 Hutool 的 CompareUtil 早就把这些事搞定了。

2025-09-14 22:11:28 865

原创 MyBatis 拦截器让搞定监控、脱敏和权限控制

MyBatis 的拦截器本质是JDK 动态代理,能在 SQL 执行的关键节点 “插队” 执行我们的逻辑。1234→************34)脱敏。比如先注册脱敏拦截器,再注册慢查询拦截器,会导致慢查询日志里的参数已经被脱敏,排查问题时看不到原始值。正确顺序:按 “SQL 执行前→执行中→执行后” 排序,比如:权限拦截器(改 SQL)→慢查询拦截器(监控)→脱敏拦截器(处理结果)。需求:自动记录所有 SQL 的执行时间,超过 500ms 就报警,包含完整 SQL 和参数。

2025-09-07 20:49:06 986

原创 Hutool DsFactory多数据源切换

DsFactory 的核心优势是零侵入配置,支持多种配置方式,不管是 properties 文件还是代码里直接定义,都能快速初始化数据源。当然它也有局限:复杂的分库分表场景还是需要 Sharding-JDBC,但普通多数据源场景用它足够了。驱动包要配齐:使用哪种数据库,就要添加对应的驱动依赖,不然会提示 “找不到驱动类”默认数据源必须有:至少要配置一个default数据源,否则会报错。切换方便:通过名称获取数据源,一行代码完成切换,不用 AOP。动态灵活:运行时可以添加、移除数据源,适合动态场景。

2025-08-31 20:41:30 615

原创 MyBatis流式查询详解

普通查询:一次性将全部结果加载到内存,然后再处理。流式查询:数据库返回一个游标(Cursor),应用端一批一批地从游标读取数据,边读边处理,避免占用大量内存。适用场景导出大批量数据(CSV、Excel)批量处理(数据同步、数据迁移)实时计算。

2025-08-24 20:06:45 753

原创 Java中四种引用的区别

在JDK 1.2以前,Java中的引用定义为:如果引用类型的数据中存储的数值代表的是另一块内存的起始地址,则这块内存即代表着一个引用。故在该定义下,一个Java对象仅有被应用和未被引用两种状态。在JDK 1.2之后,Java对引用的概念进行了扩充,将引用分为强引用、软引用、弱引用和虚引用。这四种引用与Java虚拟机的垃圾回收机制紧密关联,建议重点关注。

2025-08-17 20:38:30 532

原创 Easy-cache:统一缓存解决方案,让开发人员告别重复的缓存代码

为了让开发人员告别重复的缓存代码,专注于业务逻辑,把缓存问题交给框架处理,基于RocksCache的思想实现了一个统一的缓存一致性解决方案:Easy-cache。线程A更新缓存时发现锁持有者不是自己,不会更新缓存。Spring AOP就是一个非常好的实现方式,在切面中编写好缓存逻辑,开发者只需要在查询方法上添加指定注解,就能获得缓存能力,无需编写任何缓存逻辑代码。如果业务场景无法容忍最终一致,必须保证实时一致,可以设置弹性过期时间为0s,此时如果缓存被更新,会立刻变成“读读并发”场景,保证实时一致性。

2025-08-10 20:23:12 1089

原创 雪花算法重复id问题

应用程序可以在启动时通过查询实例/容器的元数据服务获取这个唯一ID,然后对这个较长的ID进行哈希并取模,映射到可用的datacenter-id和worker-id范围内(如总ID%1024,得到 0-1023的一个值)。若业务需要扩容至超过worker-id最大阈值(如32个以上Pod),直接使用索引会导致worker-id重复,需结合数据中心ID(datacenter-id)拆分(如用 StatefulSet 名称哈希作为datacenter-id)。分配一个固定且有序的唯一索引(从0开始)。

2025-08-03 20:20:26 1292

原创 Hutool 的 EnumUtil 有多香?Java 枚举操作从此告别繁琐

枚举操作虽小,但写多了也费时间。Hutool 的EnumUtil就像给枚举操作开了 “快捷键”—— 不用再写循环、不用再堆 if-else,一行代码搞定大部分需求,既能减少 bug,又能让代码更清爽。

2025-07-27 20:25:15 1284

原创 分区和分表有什么区别?

数据库中数据量过多,表太大的时候,不仅可以做分库分表,还可以做表分区,分区和分表类似,都是按照一定的规则将一张大表进行分解。听上去好像也差不多,不就是将表拆分吗?那具体有什么差别呢?

2025-07-20 19:15:40 322

原创 常见Spring事务失效原理解析

Spring事务失效的场景。

2025-07-13 20:56:00 548

原创 java easyExce 动态表头列数不固定

在开发中,可能会碰到多个客户提供不同格式的表单,导致表头不固定。例如,客户上传的 Excel 数据可能包含不同的字段,这些字段会动态变化,此时我们需要一个灵活的处理方案。下面是一个简单的 UML 序列图,展示了生成 Excel 的流程。下面是一个使用 EasyExcel 导出动态表头的简单示例。

2025-07-06 23:51:18 364

原创 Stream很好,Map很酷,但答应我别用toMap()!

你不信邪,断点一打,堆栈一看,硕大的 uniqKeys 摆在了面前,点开一看,谁家好人 map key 还要去重判断啊。看着运行完美无缺的代码,你一时陷入了沉思,数分钟过去了,你删除了 for 循环,换上 Stream 与 Optional 不羁的外衣,安心的提交了代码,这口细糠一定也要让好同事去尝一尝。这 TM 不是一个循环就万事大吉了吗,不信邪的你回归初心,回归了 for 循环的怀抱,又写了一版。再次执行程序,你似乎已经看到知乎的摸鱼贴在向你招手了,结果啪的一下 NPE 又拍在你那笑容渐渐消失的脸上。

2025-06-29 20:31:22 317

原创 MySQL 实战案例:地理空间数据处理——附近的人、地理围栏查询实现

查询需求SQL 方案适用场景查找附近的人(5km 内适合小规模数据(百万级)优化查找附近的人(亿级数据)大规模数据,走索引先筛选判断某个点是否在区域内商家配送范围、考勤围栏查询某个区域内的所有用户城市、商圈查询小数据量(百万级以内):直接用 ST_Distance_Sphere()。大数据量(上千万级):先用 MBRContains() 走索引,再用 ST_Distance_Sphere() 精确计算。

2025-06-22 21:29:32 748

原创 Git里面Stash Changes和UnStash Changes使用

git如果本地有文件改动未提交、且该文件和服务器最新版本有冲突,pull更新会提示错误,无法更新:要么先commit自己的改动再pull,要么使用Stash Changes后再pull。stash的好处是可以先将你的改动暂存到本地仓库中,随时可以取出来(UnStash Changes)再用,但是不用担心下次push到服务器时,把不想提交的改动也push到服务器上,因为Stash Changes的内容不参与commit和push。

2025-06-15 20:16:11 708

原创 LambdaqueryWrapper的介绍与使用

为了实现简化操作,mybatis-plus 引入条件构造器简化基本 sql 操作,主要使用两种,一种是查询的条件构造器(QueryWrapper),另外一种是(UpdateWrapper),这些条件构造器主要关系如下:其中,LambdaQueryWrapper使用lambda表达式可以直接通过实体类get()属性,而QueryWrapper必须要与数据库的中表名一致,由于表名可能会很复杂,这时候相较而言LambdaQueryWrapper会比QueryWrapper便捷不少。

2025-06-08 22:01:45 804 1

原创 Java steam map失效

Java 8引入了一种新的编程范式——Stream API,它使得对集合的操作变得更加方便和优雅。然而,在实际项目中,有时我们会遇到map()方法失效的情况,这个问题不仅仅是API的使用问题,有时也涉及到Java语言的特性和编程思维。在本文中,我们将探讨这一问题并提供一些例子,帮助你更好地理解Stream API的使用。Java Stream API允许我们以功能化的方式对集合中的元素进行处理,它支持链式操作。下面是一个Stream的简单使用示例,我们将创建一个整数数组,并使用方法将其转换为平方值数组。

2025-06-02 00:07:56 408

原创 Java 中 JSON 字段不固定怎么搞序列化?用好这两个注解就够了!

像开了一家灵活应对一切需求的「杂货铺」🧃🧂想象你是个 JSON 杂货铺老板,门口写着招牌:“你有啥,我都能装;你要啥,我都能配。“老板,有没有草莓味的牙膏?“能不能加点冰块到辣酱里?这些你事先没在货架上准备的“临时需求”,你也得接单,对吧?

2025-05-25 21:29:00 790

原创 EasyExcel动态表头

如果您的问题涉及到读取动态表头的信息,请参照另一段知识中关于读取表头数据的说明,那包括了如何通过监听器invokeHead(Map<Integer, ReadCellData<?动态表头的需求通常来源于希望根据用户的选择或者运行时的数据情况自动生成Excel的表头,这在导出具有可配置列的报表时非常有用。分离表头与数据:将表头的写入与数据的写入分开处理,使得在需要修改表头时无需更改数据处理逻辑,增强了代码的灵活性和可维护性。

2025-05-18 20:42:55 905

原创 Spring Boot 断言:让你的代码在上线前就通过“体检”!

想象一下,你在做菜。你心里想的是:“我加盐的时候,盐的量一定要是 5 克,不能多也不能少!🧂” 如果盐的量不是 5 克,那这道菜可能就毁了。😫断言,就像你做菜时的这个“心里想的”。它是一种检查机制,用来确保你的代码在运行过程中,某些条件必须为真。✅ 如果条件不为真,就说明代码出了问题,应该立即停止运行,并告诉你哪里出错了。🚨更正式的说法:断言是一种编程技巧,用于在代码中插入一些检查点,验证程序的状态是否符合预期。

2025-05-08 17:58:38 847

原创 枚举类如何使用

默认为private static final(不能再写)成员属性必须声明为private final构造器私有化,可不写private扩展方法根据需求可以写,调用方式:类名.枚举name.方法名()toString()方法被Enum抽象类重写了,返回值是枚举值的name–根据需要可以重写enum关键字创建枚举类,获取枚举值的遍历方式: 方式1:遍历:类名.class.getEnumConstants() 方式2:遍历:类名.values()方式二:JDK5.0以后,可以使用enum关键字定义枚举类。

2025-04-28 08:58:16 341

原创 Java中的本地缓存:4种实现方式

今天我们一起探索了Java本地缓存的多种实现方式,从手写缓存到Guava Cache、Caffeine、Ehcache和JetCache。每种方式都有自己的特点和适用场景。

2025-04-20 20:40:18 1551

原创 MySQL 用 limit 影响性能的优化方案

如果我们的表非常大,或者数据分布不均匀,我们可以尝试使用分区表,也就是将一张大表分成多个小表,并按照某个字段或者范围进行划分。如果我们不能使用索引覆盖扫描,或者查询字段较多,我们可以尝试使用子查询,也就是先用一个子查询找出我们需要的记录的 id 值,然后再用一个主查询根据 id 值获取其他字段。如果我们只需要查询部分字段,而不是所有字段,我们可以尝试使用索引覆盖扫描,也就是让查询所需的所有字段都在索引中,这样就不需要再访问数据页,减少了随机 I/O 操作。

2025-04-13 22:14:47 450

原创 主流程发起,去除子流程的时长计算问题

有三个流程,流程1.2.3,流程2.3是流程1的子流程,若在流程1的过程中发起流程2.3,计算流程1的时长要排除流程2.3的时间,流程2.3之间可能是包含、交集、无交集三种。

2025-04-06 22:04:27 687

原创 Java List 集合取交集、并集、差集、补集

本文介绍了Java中List集合的交集、并集、差集和补集操作的实现方法,包括传统的retainAll、addAll方法,以及现代的Stream API和Apache Commons Collections库。这些方法在实际开发中非常有用,尤其是在处理大量数据集合时,能够显著提高代码效率和可读性。希望本文能帮助您更好地理解和使用Java集合操作,提升开发效率!

2025-03-30 21:56:35 979

原创 JAVA:使用 WebView 实现桌面程序的技术指南

在本博客中,我们介绍了如何在 JavaFX 中使用WebView加载网页,并实现 Java 与 JavaScript 之间的交互。在 Java 中嵌入 WebView 并加载网页Java 调用 JavaScript 代码JavaScript 调用 Java 方法将 Java WebView 应用打包成.exe通过 WebView,可以轻松地在 Java 桌面应用中嵌入 Web 技术,从而结合 Web 和 Java 的优势来开发强大的桌面应用。

2025-03-16 20:05:45 2646

原创 ClassUtil:Hutool库中反射操作的高效利器

ClassUtil 是 Hutool 库中一个非常实用的工具类,它通过封装 Java 的反射机制,使得开发者能够更加方便地进行类和对象的操作。无论是用于框架开发还是通用工具开发,ClassUtil 都能显著提高开发效率并减少代码冗余。对于 Java 开发者来说,掌握 ClassUtil 的使用无疑是一个提升生产力的重要手段。

2025-03-09 20:50:12 600

原创 ETL-kettle数据转换使用详解

并点击执行按钮,会自动在MySQL数据库中创建该表。可以去数据库验证下。数据库连接这里 点击新建连接,配置数据库连接信息,点击测试连接,看是否成功,如果报错,看是否世缺少jdbc的驱动,去MySQL官网下载对应的驱动即可。双击表输入,文件选择源文件的位置,然后点击增加,在点击【工作表】,获取工作表名称,把标签移到右边。输入目标表的名称为:user,后续Kettle将在MySQL中创建一张名为 user 的表格。点击下方的「SQL」按钮,可以看到Kettle会自动帮助我们生成MySQL创建表的SQL语句。

2025-03-02 18:50:52 604

原创 了解状态机

状态机(State Machine)是一种数学模型,用于描述系统或程序在不同状态之间转换的行为。它由一组状态、转移条件和动作组成。状态机可以被看作是一个抽象的机器,它可以处于不同的状态,并根据输入条件执行相应的动作来改变状态。状态表示了系统或程序所处的特定情况或阶段,而转移条件决定了在何种条件下从一个状态转移到另一个状态,动作则表示在状态转移时要执行的操作。总之,使用状态机需要注意清晰定义状态和转换条件、处理错误情况、考虑复杂性和可测试性,并保持系统的可扩展性和可维护性。

2025-02-23 20:20:08 674

原创 DeepSeek接口调用

整个对接过程很简单,就四步,获取key,找到接口文档,接口测试,代码对接。

2025-02-11 10:02:45 2988

原创 Java——Stream流的peek方法详解

peek()是一个中间操作,它允许我们在流的每个元素上执行一个操作,但并不会改变流中的元素或中断流的处理。常用作调试工具,用来在流的各个操作步骤中查看流中的数据。它接收一个Consumer函数作为参数,Consumer函数可以对每个流中的元素执行某些动作。peek()不会消耗流,只是执行一个旁路行为。因为是中间操作,它不会触发终端操作,因此在调用完peek()后,还需要调用诸如forEach()、collect()这类终端操作来触发流的处理。

2025-01-19 22:05:27 2648 1

原创 Redis 的6种回收策略(淘汰策略)详解

在Redis中,当内存使用达到上限时,为了保持服务的稳定性和响应速度,Redis提供了多种数据回收(淘汰)策略,以便在必要时释放内存空间。本文将详细介绍Redis的六种主要淘汰策略。

2025-01-11 17:22:36 570

原创 使用YApi平台来管理接口

YAPI是一个功能强大、易于使用的接口管理平台,它提供了完整的接口管理解决方案,包括接口的创建、调试、测试、文档生成等功能。通过Docker容器化技术,YAPI可以方便地在多种操作系统上部署和运行,为团队协作和项目开发提供了强大的支持。无论是个人开发者还是大型团队,都可以借助YAPI提升工作效率并优化API开发流程。

2025-01-05 21:04:40 370 1

原创 工作流并行网关退回思路

处于并行网关内回退至网关外节点(如2.1回退到1),需考虑2.2是否已经完成,若已完成则不用管,若未完成,则需将2.2任务删除,否则会出现两个不同的退回信息。处于并行网关外回退至网关内节点(如3回退到2.1),需将2.2也回退,不然2.1通过后3不会创建新任务。在设计工作流时遇到并行的流程,会出现并行流程的退回,这里记录下想到的解决思路,后续问题会记录在这里。

2024-12-29 21:44:54 590

原创 Mysql之主从复制

MySQL的主从复制(Master-SlaveReplication)是一种数据复制解决方案,将主数据库的DDL和DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而是的从库和主库的数据保存同步。MySQL支持将数据从一个MySQL服务器(主服务器)复制到一个或多个其他MySQL服务器(从服务器),从库同时也可以作为其他从服务器的主库,实现链状复制。主库出现问题,可以快速切换到从库提供服务;实现读写分离,降低主库的访问压力;

2024-12-22 20:13:56 639

原创 Java中BigDecimal比较大小的方法

在Java中,BigDecimal类提供了三种比较大小的方法,分别是​​compareTo()​​、​​equals()​​和​​compareTo()​​。在调用 ​​Collections.sort()​​ 方法时,会自动调用 ​​Person​​ 类中的 ​​compareTo()​​ 方法进行排序。在上面的例子中,我们根据 ​​age​​ 属性的大小来比较两个 ​​Person​​ 对象。在Java中,​​compareTo()​​​ 是 ​​Comparable​​​ 接口中定义的一个方法。

2024-12-15 21:32:38 4879

空空如也

空空如也

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

TA关注的人

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