- 博客(98)
- 收藏
- 关注
原创 Java监控与分析工具
(Java Virtual Machine Statistics Monitoring Tool)是 JDK 自带的命令行工具,用于监控 JVM 的 GC(垃圾回收)行为、类加载、编译等。在 Java 开发过程中,了解并掌握 JVM(Java 虚拟机)监控与分析工具对于排查性能问题、优化应用至关重要。是 JDK 自带的 GUI 工具,提供线程、堆、GC 监控及分析功能。是 Java 自带的 GUI 监控工具,提供基本的 JVM 监控能力。是功能最强大的 JVM 诊断工具,可以替代。
2025-04-04 11:27:25
570
原创 VS Code 必装插件推荐
📌 作用:通义灵码,为开发者提供智能代码建议、代码自动补全、错误检测和修复等功能,提升开发效率。:为 VS Code 提供全面的 Markdown 编辑功能,包括实时预览、自动生成 TOC(目录)、语法高亮、格式化等,提高 Markdown 文件编辑效率。:支持一键运行 JavaScript、Python、Java、C/C++、Go 等语言代码,免去手动打开终端执行命令的麻烦。📌 适用:前端开发,特别适合 HTML、CSS、JavaScript 项目,快速查看代码改动效果,提升开发效率。
2025-04-02 21:02:47
769
原创 使用 GitHub Pages 快速部署静态网页
支持直接从 GitHub 仓库中部署 HTML、CSS、JavaScript 等。GitHub Pages 来部署前端框架(Vue 3 + Vite)项目。这个包用于将构建好的项目推送到 GitHub 仓库的。替换为你的 GitHub 用户名。,适用于个人博客、项目展示页面等。一般前面操作对了就可以直接访问。是 GitHub 提供的免费。
2025-03-25 13:16:20
648
原创 npm安装依赖报错EPERM: operation not permitted快速解决
通过将目录修改为用户目录(如 C:\Users\35571),可以避免权限问题,【用户目录是用户私有的,操作系统会确保用户对自己的目录有最高权限。设置到用户目录下,避免权限问题。
2025-03-24 08:48:53
554
原创 使用Vite快速创建Vue3项目
使用 Vite 创建 Vue 3 项目之前,确实需要先安装Node.js。Vite 是基于 Node.js 的构建工具。
2025-03-23 13:26:44
480
原创 如何编写一个Spring Boot Starter
这只是一个比较简单的示例。根据具体场景实现丰富的 starter。注意:命名规范:Starter 通常命名为 xxx-spring-boot-starter,自动配置类为 xxxAutoConfiguration。版本兼容性:确保与目标项目的 Spring Boot 版本一致。发布:考虑将 Starter 发布到 Maven Central 等。【deploy发布到远程仓库(maven私服)】❤觉得有用的可以留个关注ya~~❤。
2025-03-22 13:59:06
466
原创 HashMap添加元素的流程图
可减少空间浪费,但会增加哈希冲突的概率;较低的负载因子则减少哈希冲突,但会增加内存开销。结构,当哈希冲突较多时,链表可能变得很长,导致查询性能从 O(1) 退化到 O(n)。回链表,以减少不必要的树操作开销,提高小规模数据场景下的性能。从JDK8开始,为了优化哈希冲突情况下的查找性能,(如果没引入红黑树,则最坏查找复杂度是O(n))在 JDK8,为了优化链表查询性能,引入了。时,链表会转换为红黑树。,以减少动态扩容带来的性能损耗。,将最坏情况下的查找复杂度从。新容量 * 0.75。
2025-03-20 23:18:33
1053
原创 AI 工具提升你的工作效率
如今各类 AI 层出不穷,不必担心 AI 会抢走我们的饭碗。相反,我们应该欣然接受AI,让它成为提升我们工作效率的得力助手。AI 在编程、写作、对话、创作等领域各有专长,选择合适的工具能大幅提升效率。感觉我们都是对AIGC的使用大多还停留在表面,局限于简单的“你问我答”模式,未能深入挖掘其潜力。只有充分利用AI的强大能力,我们才能真正提升工作效率,释放更多创造力和生产力。在使用AI时,掌握有效的提问技巧能够显著提高获取理想答案的效率。
2025-03-03 17:00:04
412
原创 利用Arthas动态修改Java代码:告别繁琐的打包与部署
步骤一:反编译代码,使用jad命令反编译目标类,获取当前运行的 Java 源代码。步骤二:修改代码,根据需求编辑反编译出的源代码,通常在本地进行微调。步骤三:内存编译,使用mc命令将修改后的 .java 文件编译为 .class 字节码文件,直接在内存中完成。步骤四:动态加载,通过redefine命令将新的字节码加载到 JVM,实时更新运行中的类,无需重启服务。
2025-02-25 19:45:14
539
原创 Java 开发中用于打印完整 SQL 语句的插件(嘎嘎有用)
在 java 开发中,sql 日志常以问号(?)作为参数占位符,这使得调试时需要手动将问号替换为实际的参数值。对于参数较少的情况,手动替换相对简单;但当参数较多时,这一过程不仅繁琐,还容易出现错误。一款IDEA插件,它能够自动将问号占位符替换为相应的参数值。打印出完整的 sql 语句。第一步:配置文件中设置日志级别为 debug。有对应的插件为我们解决了这个问题。
2025-02-20 21:46:45
525
原创 MyBatisPlus 自定义拦截器:全面记录 SQL 执行日志
/ 记录 SQL 日志的日志器 public static final Logger log = LoggerFactory . getLogger("sys-sql");/*** 查询前的拦截* @param executor Executor实例* @param ms MappedStatement实例* @param parameter 查询参数* @param rowBounds 分页信息* @param resultHandler 结果处理器。
2025-02-19 09:00:00
936
原创 SpringBoot整合ClickHouse数据库教程
ClickHouse 是一个开源的列式数据库,专为 OLAP(联机分析处理)工作负载设计,适合大规模的数据分析。成功整合 Spring Boot 与 ClickHouse 数据库,搭建了一个基础 Demo,可根据实际需求扩展功能。可以使用 MyBatis 简化数据访问。只需更换 MySQL 驱动即可,多对比学习。当然,ClickHouse 还具备许多强大功能,推荐查阅相关教程深入了解。❤觉得有用的可以留个关注❤。
2025-02-18 22:19:43
756
原创 Spring Boot中使用Flyway进行数据库迁移
如果数据库的当前版本是 1,而你的迁移脚本的版本号也是 1 或者更低,Flyway 会认为这些脚本已经执行过,因此不会再次执行。启动 Spring Boot 应用,Flyway 会自动执行 db/migration 目录下的迁移脚本,并将执行记录存储在 flyway_schema_history 表中。手动执行 SQL 脚本不仅容易出错,也难以维护数据库版本的一致性。如果本地迁移脚本的内容发生了更改(例如,修改了 SQL 脚本),Flyway 会检测到校验和不匹配,从而抛出此错误。
2025-02-14 22:59:49
796
原创 力扣hot100--2
(Binary Tree)是一种树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树在算法和计算机科学中具有广泛的应用,特别是在表达式解析、搜索算法、排序算法、优先级队列、堆和其他数据结构中。递归:迭代:回溯:动态规划:分治法:原题链接:二叉树的中序遍历方法2–使用栈栈(Stack):利用栈来模拟递归的行为。栈在遍历左子树时保存节点,确保能够回到父节点,并遍历右子树。对于二叉树的中序遍历,访问节点的顺序是:。代码的关键在于使用了一个来模拟递归调用的过程。题目: 二叉树的最大
2025-01-27 10:46:06
647
原创 设计模式-策略模式
在项目开发过程中,我接连几次运用策略模式,对它的理解也随之愈发深刻。当我写这篇博客突然想到一个非常适合这个策略模式的例子:支付方式选择(支付宝、微信、银行卡支付等)。
2025-01-21 09:55:17
420
原创 Jackson 中的多态类型支持:@JsonTypeInfo 和 @JsonSubTypes 使用技巧
它们的作用是在序列化和反序列化过程中,帮助 Jackson 识别和处理父类与子类之间的关系。注解用于列出所有可能的子类类型,并为每个子类指定一个唯一的名称(或标识符)。注解用于指定在序列化和反序列化过程中如何处理类型信息。:指定类型信息如何包含在 JSON 中。jackson 坐标:(三个依赖保持版本一致):指定类型信息的标识方式。时,指定类型信息属性的名称。表示在 JSON 中添加一个名为。是 Jackson 库中用于处理。的字段来存储类型信息。
2025-01-16 16:42:18
1025
原创 DataGrip的数据库驱动的离线安装
请确保下载的驱动版本与您所使用的数据库版本完全兼容,以避免出现连接或功能异常。在某些工作环境中,由于网络访问受限,可能无法自动下载所需的数据库驱动。
2025-01-10 15:24:59
475
原创 OCR图片中文字识别(Tess4j)
Tess4J 是 Tesseract OCR 引擎的 Java 封装库,它让 Java 项目更轻松地实现 OCR(光学字符识别)功能。写一个main方法,使用 Tesseract OCR 引擎对图像进行。看网上教程,要下载相应的语言包,下。
2025-01-03 22:44:17
791
原创 力扣hot100
因为 HashSet 使用的是对象的引用进行比较,所以如果两个节点是同一个节点(即内存地址相同),HashSet 会检测到这个重复的引用,从而判断链表中存在环。我的思路是通过排序后的字符串作为哈希表的键,将原字符串作为值添加到相应的键对应的列表中。否则,更新 merged 列表中最后一个区间的结束值。思路是通过遍历两个链表,计算对应节点值与进位的和,处理进位并构建新链表,最后返回不含虚拟头节点的结果链表。评论区看到一个【还有句话:走到尽头见不到你,于是走过你来时的路,等到相遇时才发现,你也走过我来时的路。
2024-11-28 16:53:23
1161
原创 线上问题排查方案总结
确认问题进程:使用top或htop找到 CPU 占用高的 Java 进程。查看线程情况:使用查看该进程的各个线程 CPU 占用情况,记录高 CPU 占用线程的 TID。转换线程 ID:将 TID 转换为十六进制,使用。生成线程 dump:使用生成线程堆栈,保存至文件。分析堆栈信息:在 dump 文件中搜索十六进制 TID,分析该线程的执行方法,排查高 CPU 的原因。
2024-11-05 16:08:07
902
原创 面试:java笔试基础总结
this 是 Java 中的一个关键字,用于指代当前对象。只有在实例方法(非static方法)或构造函数中,才有“当前对象”这个概念。静态方法(static)不属于具体的对象,而是属于类。已知32位系统,字节为编址单位,1个页面大小为4KB,页表项大小为4B,那么存储页表需要多少空间。即使在 catch 块中有 return 语句,finally 块仍然会执行。当时遇到这个题,我是直接在纸上画出来的,画的时候细心一般都不会出错。因为 i j 是不同的对象,地址不同,所以false。
2024-10-16 18:16:11
591
原创 数据结构 -- 跳表
它可以看作是链表与二分查找的结合体,能够在保持数据有序的同时,实现快速的查找,时间复杂度与平衡树(如红黑树)相同,但实现上更为简单。,但是其底层结构需要维护多个层次的节点分裂、合并等复杂操作,特别是在插入和删除时,涉及平衡和重构,带来较高的性能成本。,但其结构更简单,动态操作(如插入、删除、更新)的实现也更加直接,符合 Redis 追求简洁高效的设计理念。删除操作与查找操作类似,从最高层开始查找需要删除的元素,找到元素后,在每一层级的链表中删除该元素的索引。:Redis 的有序集合为什么不使用B+树?
2024-10-11 16:13:21
1469
1
原创 Redis 实现 查找附近的人 功能
使用 Redis 实现“查找附近的人”功能,通常会依赖 Redis 的Geo(地理位置)数据类型来存储用户的经纬度,并基于此进行地理范围查询。Redis 通过GEOADDGEORADIUS等命令来存储用户位置和查找一定范围内的用户。存储用户的地理位置:我们需要存储用户的经纬度信息,以便后续可以基于此进行地理查询。Redis 提供了GEOADD命令,允许将用户的经纬度信息存储在 Redis 中的有序集合中(底层基于ZSet实现)。根据当前用户的位置查找附近的用户:使用GEORADIUS或。
2024-10-09 12:19:39
827
原创 OpenFeign原理
OpenFeign的原理主要涉及通过代理类将服务名称替换为具体的 IP:端口 来实现远程服务调用。Feign 生成代理类:使用 JDK 动态代理为接口生成代理,拦截接口方法调用,构建 HTTP 请求。服务名称替换为IP:端口:Feign 会将服务名称(如serviceA)通过 Ribbon 进行解析,将其替换为对应的IP:端口。负载均衡:Ribbon 在服务发现的基础上,对多个服务实例进行负载均衡,选择一个合适的服务实例。发送 HTTP 请求。
2024-09-13 11:33:52
1605
原创 HashMap线程不安全|Hashtable|ConcurrentHashMap
加锁机制:对每个桶(tab[i])的头节点进行加锁。这种锁定策略使得同一个桶中的修改是线程安全的。并发性能优化:这种设计避免了全局锁,提高了在高并发环境下的性能。当多个线程操作不同的桶时,操作不会相互干扰。
2024-09-12 16:55:51
960
原创 Redisson实现订单到期关闭
在电商、支付等系统中,一般都是先创建订单(支付单),再给用户一定的时间进行支付,如果没有按时支付的话,就需要把之前的订单(支付单)取消掉。这种类似的场景有很多,还有比如到期自动收货、超时自动退款、下单后自动发送短信等等都是类似的业务问题。7、RabbitMQ死信队列(MQ 方案不推荐,大量无效调度)8、RabbitMQ插件(MQ 方案不推荐,大量无效调度)3、DelayQueue(不推荐,基于内存,无法持久化)10、Redis的ZSet(不推荐,可能会重复消费)4、时间轮(不推荐,基于内存,无法持久化)
2024-09-11 16:42:35
1113
原创 数据结构--二叉树
二叉树(Binary Tree)是一种树形数据结构,其中每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树是各种树结构的基础,广泛应用于数据存储、排序、搜索等领域。
2024-09-10 21:01:04
1793
原创 面试笔试 场景题(部分总结)
优先级队列按比较器排序,如果比较器为空,则按元素的自然顺序排序:对于堆中的每个节点 n 和 n 的每个后代 d,n <= d。创建一个最大堆(PriorityQueue,指定了 Comparator.reverseOrder() 来使其成为最大堆)。来实现,默认是最小堆,即堆顶是队列中最小的元素。数据结构的一个重要类,它基于优先级队列(Priority Queue)的概念。你使用最大堆来找出第 k 小的元素。最大堆的特点是堆顶元素是当前堆中的最大值。当堆的大小超过 k 时,移除堆顶元素(即当前最大元素)。
2024-09-09 18:02:23
1003
原创 数据结构--大根堆小根堆
堆是一种优先级队列实现,通常用于高效地找出最值(最大或最小值)。堆的每个父节点都和其子节点满足一定的关系。是堆调整操作的核心,用来维护堆的性质。是堆(Heap)数据结构的两种类型,它们都是。个元素,这些元素在数组中的索引是从。堆可以使用数组来实现,这是由于堆的。假设堆中某个节点位于数组的索引。最小堆(又称:小根堆,小顶堆)最大堆(又称:大根堆,大顶堆)结构具备的特性使得它可以。映射到一个一维数组中。
2024-09-09 17:38:55
2024
1
原创 SpringBoot登录退出|苍穹外卖登录退出分析
用户登录:用户提交登录请求➡️后端认证用户(拦截器会放行登录接口,先判断用户名密码,然后生成token)➡️生成令牌token,并将其返回给客户端。
2024-09-07 18:45:50
1911
原创 动态规划DP--背包问题
在 0-1 背包问题中,给定一个背包的最大容量W,以及n重量:第i个物品的重量为wt[i]价值:第i个物品的价值为val[i]目标是选择若干个物品装入背包,使得在不超过背包最大容量W的前提下,装入背包的物品的总价值最大。注意:0-1 背包中的 “0-1” 指的是每个物品只能被选取一次(即要么选择该物品,要么不选,不存在把物品拆一半放入背包)。这个0-1背包问题很经典。详情可以买本labuladong的算法笔记这本书看看,或者去网站看。
2024-09-05 17:20:11
1271
原创 力扣刷题(复习版2)
设 currentSum 表示当前的前缀和,也就是从数组起点到当前位置的元素之和。我们希望找到一个子数组,使得这个子数组的和等于 k。假设我们当前遍历到数组位置 j,当前的前缀和为 currentSum。具体来说,遍历字符串 s,并用变量 preSign 记录每个数字之前的运算符,对于第一个数字,其之前的运算符视为加号。(因为已知k,不知道sum[i-1] ,所以把k移到等号左边,看map中是否包含sum[i-1],包含则说明。O(n) 检查回文(reverse() 需要 O(n))方法1:暴力(通过了)
2024-09-04 22:24:11
378
原创 探索ArrayList的线程不安全性
像HahsMapTreeMap都不是线程安全的,当然 HashSet 由 HashMap 实现,所以HashSet 线程不安全;TreeSet 由 TreeMap 实现,所以HashSet 线程不安全。为了解决这个问题,可以使用线程安全的替代品,例如通过 Collections.synchronizedSet() 来包装一个 Set,确保其线程安全。Collections工具类中的替代品写时复制CopyOnWrite 是一种并发编程策略,常用于实现线程安全的集合类。它的核心思想是。
2024-09-03 17:21:06
719
原创 基于 Redis 的 HyperLogLog 实现了 UV 的统计
在现代网站开发中,用户行为分析是一个非常重要的环节。其中,UV(Unique Visitor,独立访客)和PV(Page View,页面浏览量)是衡量网站流量和用户活跃度的关键指标。UV 指的是通过互联网访问网站的自然人数量,通常一个用户在一定时间内的多次访问只计作一次;而 PV 则指的是用户访问网站的页面次数,无论是否来自同一用户,每次访问都会计入。HyperLogLog 是一种用于基数估计的概率性数据结构,可以高效地估算集合中唯一元素的数量(基数)。
2024-08-28 17:22:21
1429
原创 Java实现UDP通信/TCP通信
客户端 (Socket用于创建连接并进行数据发送和接收。服务端 (用于监听端口并接受客户端连接。和用于在 TCP 连接中发送和接收数据。在实际应用中,确保在发送数据后调用flush()方法,以确保数据及时发送,并在接收数据时正确处理流的关闭和异常情况。❤觉得有用的可以留个关注~~❤。
2024-08-27 11:00:00
1348
原创 力扣刷题(复习版1)
拿到一个题目要认真读题(建议读2遍),没思路可以看一下提示,有时候提示会给你一些解题思路的不要被给的输入输出示例迷惑了,有时候会干扰你解题的。
2024-08-26 13:10:54
545
原创 SpringBoot自动配置原理
Spring Boot 的自动配置是其核心特性之一,它简化了 Spring 应用程序的配置,使得开发者能够快速启动和运行 Spring 应用,而无需手动编写大量的配置代码。在 Spring Boot 中,:指定这是一个 Spring Boot 配置类,相当于。:启用自动配置,核心注解,通过读取文件自动配置项目。:自动扫描项目中的组件,如@Service等,通常不需要额外配置。自动配置的工作原理注解使用@Import注解导入配置选择器。配置选择器会读取文件中的配置类列表。
2024-08-26 11:02:27
1605
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人