- 博客(114)
- 收藏
- 关注
原创 JVM内存分区
摘要:JVM内存分区分为线程私有区域(程序计数器、虚拟机栈、本地方法栈)和线程共享区域(堆、方法区)。程序计数器记录指令地址,无OOM风险;虚拟机栈存储方法调用的栈帧,可能出现栈溢出;堆是最大内存区域,存储对象实例;方法区存放类元数据等,JDK1.8后由永久代改为元空间。各区域功能明确,生命周期不同,理解其特性有助于优化内存使用和排查OOM问题。开发中需注意递归导致的栈溢出和批量对象引发的堆溢出等情况。
2025-12-24 07:15:00
489
原创 OOM是如何解决的?
Java 程序运行时,需要申请的内存空间超过了 JVM(或系统)所能提供的最大内存限制,导致内存分配失败而抛出的异常。生活类比:你手机的运行内存(8G)是固定的,同时打开了微信、抖音、游戏、视频剪辑等多个大型 APP,当再打开一个大型 APP 时,手机无法分配足够内存,就会出现 “卡顿闪退”,相当于 Java 程序的 OOM。
2025-12-23 20:18:06
560
原创 线程池核心参数和执行流程
当任务处理完毕,非核心线程处于空闲状态时,若空闲时间超过keepAliveTime,该非核心线程会被销毁,线程池的线程数会回落至corePoolSize(除非开启了核心线程空闲销毁)。:线程池的核心目的是「复用线程(避免频繁创建销毁线程的性能损耗)、控制并发数(避免线程过多导致 CPU 上下文切换频繁)、有序处理任务(通过队列缓冲)」。
2025-12-23 12:00:00
1209
原创 MyBatis 中 #和 $ 的区别?
MyBatis中#{}和${}的核心区别在于SQL处理方式和安全性。#{}采用预编译方式处理参数,能有效防止SQL注入,适用于绝大多数业务场景;${}直接拼接SQL字符串,存在注入风险,仅限动态表名、列名等特殊场景使用。使用原则:优先使用#{}确保安全,必须使用${}时需严格校验参数(如白名单过滤)。关键记忆:#{}是安全预编译占位符,${}是风险字符串拼接。
2025-12-23 07:30:00
241
原创 为什么不用MyBatis而是用MyBatis-Plus?
MyBatis-Plus是MyBatis的增强工具,旨在解决MyBatis在业务开发中的痛点。核心优势包括:1)提供通用CRUD接口,省去重复SQL编写;2)内置分页插件简化分页查询;3)支持Lambda条件查询避免字段硬编码;4)集成自动填充、逻辑删除等实用功能;5)完全兼容MyBatis,支持自定义复杂SQL。相比原生MyBatis,MyBatis-Plus通过减少重复代码显著提升开发效率,特别适合快速开发场景,同时保持MyBatis的灵活性。选择MP的本质是用更少代码完成更多工作,降低出错概率。
2025-12-22 20:16:42
916
原创 List和Set的区别
Java集合框架中List和Set的核心区别在于:List是有序可重复集合,支持索引访问,常用实现类包括ArrayList(数组实现,查询快)和LinkedList(链表实现,增删快);Set是无序不可重复集合,通过哈希值或比较器保证唯一性,主要实现类有HashSet(哈希表实现)和TreeSet(红黑树实现,可排序)。实际开发中应根据业务需求选择:需要保持插入顺序或重复元素时用List,需要去重或排序时用Set。特别注意使用HashSet存储自定义对象时必须重写hashCode()和equals()方法,
2025-12-22 16:13:24
408
原创 责任链模式
责任链模式是一种将多个处理者串联成链的设计模式,请求会沿链传递直至被处理。典型应用如请假审批流程,不同层级管理者根据权限处理或传递请求。该模式包含抽象处理者、具体处理者和请求对象三大角色,通过解耦请求与处理实现灵活扩展。实际项目中,如运费模板查找场景,通过责任链模式可以优雅地实现优先级判断(同城>省内>经济区>跨省),避免if-else嵌套,符合开闭原则。核心实现包含抽象处理器定义传递规则、具体处理器专注自身逻辑、链组装器构建处理顺序三部分,具有解耦、易扩展、职责单一等优势,是处理多级条件
2025-12-21 16:15:45
750
原创 分布式环境下的唯一性保障
本文探讨分布式环境下唯一性保障的两大核心场景:全局唯一标识生成和分布式业务操作唯一性。对于全局唯一ID,分析了雪花算法、数据库自增策略、UUID和Redis自增四种方案,其中雪花算法因高性能和无依赖成为首选。对于业务操作防重,介绍了Redis分布式锁、ZooKeeper分布式锁和基于唯一业务号的幂等性设计三种方法,推荐结合Redis分布式锁与数据库唯一约束实现双重保障。文章对比了各方案的优缺点,强调雪花算法需处理时钟回拨、Redis锁需设置过期时间等关键点,为分布式系统设计提供了实用指导。
2025-12-21 07:30:00
761
原创 MySQL中给字段添加唯一约束的方式有哪些?
MySQL唯一约束用于确保字段值的唯一性,防止重复数据插入。添加方式有三种:1)创建表时通过UNIQUE关键字添加单列或多列联合约束;2)表存在时使用ALTER TABLE添加;3)创建唯一索引实现同等功能。核心特性包括:允许NULL值(可多个),与主键区别在于可多个约束且允许空值。适用场景包括用户名、手机号等需唯一性字段,以及多字段组合唯一(如部门内用户名)。注意需区分单列与多列约束逻辑,建议指定约束名便于维护。
2025-12-20 15:08:29
644
原创 MySQL中多表查询的方式有哪些?
多表查询是数据库操作的核心技能,主要包括JOIN连接(内连接、外连接)、子查询和联合查询三种方式。内连接取两表交集,左/右外连接保留主表全量数据,子查询适合简单条件过滤,联合查询用于合并结果集。实际应用中需注意:JOIN性能优于子查询,关联条件写在ON而非WHERE,合理使用索引提升效率。典型场景如查询无订单用户(LEFT JOIN+NULL判断)或合并多条件结果(UNION ALL)。掌握这些方法能有效处理复杂数据关联需求。
2025-12-20 11:16:59
703
原创 SpringBoot自动装配原理
摘要:SpringBoot自动装配原理通过@SpringBootApplication注解中的@EnableAutoConfiguration实现,自动加载META-INF/spring.factories中定义的配置类。这些配置类通过@Conditional系列注解按需生效,并利用@ConfigurationProperties绑定配置文件属性,实现"引入依赖即能用"的功能。该机制遵循"约定大于配置"思想,既减少了手动配置工作量,又支持通过自定义Bean覆盖自动配置
2025-12-19 21:12:09
951
3
原创 tomcat正常启动但 SpringMVC 控制器无法启动
摘要: 排查Tomcat启动后无法访问SpringMVC接口的问题,发现是IDEA工件配置缺失导致依赖JAR未复制到out/artifacts/.../WEB-INF/lib目录。尽管Java类文件正常编译到WEB-INF/classes,但缺少Servlet/SpringMVC核心JAR导致请求无法路由。解决方法是手动将依赖JAR添加到lib目录并重新构建。文中对比了IDEA的out目录(IDE专属)与Maven的target目录(构建工具标准)的区别,强调out/artifacts是Tomcat实际加载
2025-12-10 21:33:27
708
原创 使用docker部署Java项目
本文介绍了使用Docker部署Java项目的完整流程:1.准备Java项目的jar包;2.编写Dockerfile文件,详细说明FROM、WORKDIR、COPY等核心指令;3.通过docker build命令构建镜像;4.使用docker run命令运行容器,包括端口映射等参数设置。重点解析了Docker镜像的只读特性和分层结构,以及容器运行时与镜像的关系,为Java项目容器化部署提供了标准化操作指南。
2025-11-09 19:29:36
734
原创 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon?
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon?
2025-11-07 10:54:15
340
原创 238.除自身以外数组的乘积
本文介绍了一种高效计算数组中除自身外元素乘积的方法。通过两次遍历(左乘积和右乘积)实现O(n)时间复杂度,避免使用除法。具体步骤:1)正向遍历计算每个元素左侧乘积;2)反向遍历结合右侧乘积完成最终结果。该方法空间复杂度O(1),且避免了除零错误,适用于含零数组。以[1,2,3,4]为例,详细演示了计算过程,验证了算法的正确性。
2025-11-03 22:22:47
409
原创 189.轮转数组
摘要:该算法实现将整数数组元素向右循环移动k位。关键处理包括:当k大于数组长度时取模运算,创建临时数组存储后k位元素和前n-k位元素,最后将临时数组复制回原数组。示例显示输入[1,2,3,4,5,6,7]和k=3时输出[5,6,7,1,2,3,4]。算法时间复杂度O(n),空间复杂度O(n)。(149字)
2025-11-02 21:58:14
185
原创 56.合并区间
摘要:该算法解决合并重叠区间问题。首先对区间按起始点排序,然后逐个处理:若当前区间与结果列表最后一个区间不重叠则直接添加,否则合并两个区间的右端点(取较大值)。示例表明该方法能正确处理各种重叠情况(如[1,3]和[2,6]合并为[1,6])。核心思想是通过排序确保区间有序,再通过比较端点实现高效合并,时间复杂度主要取决于排序步骤。
2025-11-01 22:22:11
219
原创 53.最大子数组和
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。方法二:遍历相加的同时选出最大值,每次相加后经过对比选出结果最大的值(最小遍历原则)可以把所有子数组求和情况算出来,每次求和进行比较选出最大值即可。连续子数组 [4,-1,2,1] 的和最大,为 6。子数组是数组中的一个连续部分。
2025-11-01 19:14:11
304
原创 560.和为k的子数组
摘要:本文介绍了求解数组中连续子数组和等于k的两种方法。方法一通过双重循环枚举所有可能的子数组,时间复杂度O(n²);方法二利用前缀和与哈希表优化,将时间复杂度降至O(n)。具体实现时,哈希表需初始化mp.put(0,1)以处理前缀和直接等于k的情况。两种方法都能正确统计满足条件的子数组数量,示例代码展示了两种循环方向(从左到右/从右到左)的实现方式。
2025-10-25 21:32:23
254
原创 438.找到字符串中所有字母异位词
摘要:本文介绍了一个解决字符串异位词查找问题的算法。给定字符串s和p,需要在s中找出所有与p构成异位词的子串,返回这些子串的起始索引。算法使用滑动窗口技术,通过维护两个字符计数数组来比较子串与p的字符分布是否相同。时间复杂度为O(n),空间复杂度为O(1)。示例展示了算法的正确性,如s="cbaebabacd"、p="abc"时输出[0,6]。该解法高效且易于实现。
2025-10-24 22:26:53
241
原创 3.无重复字符的最长子串
所以其长度为 3。注意 "bca" 和 "cab" 也是正确答案。,请你找出其中不含有重复字符的。请注意,你的答案必须是。因为无重复字符的最长子串是。因为无重复字符的最长子串是。因为无重复字符的最长子串是。,所以其长度为 1。,所以其长度为 3。
2025-10-23 22:15:33
344
原创 42.接雨水
本文探讨了如何计算柱状图中能接住的雨水总量。通过双指针法,分别从左右两端遍历,记录左右最大值,并比较当前指针高度。若左指针高度较小,则计算左指针处能接的雨水(左最大值减去当前高度),并右移左指针;反之同理。该方法时间复杂度为O(n)。示例展示了输入[0,1,0,2,1,0,1,3,2,1,2,1]时输出6,输入[4,2,0,3,2,5]时输出9。官方解法通过动态更新左右最大值高效求解,优于直接填充柱子的朴素思路。
2025-10-22 20:23:06
252
原创 15.三数之和
三个数之和用双指针遍历所有情况然后通过Arrays进行排序再添加到集合中。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。注意,输出的顺序和三元组的顺序并不重要。下面是暴力算法结果 超出时间限制。答案中不可以包含重复的三元组。唯一可能的三元组和不为 0。唯一可能的三元组和为 0。,判断是否存在三元组。
2025-10-21 22:23:04
232
原创 11. 盛最多水的容器
本文探讨了如何计算由数组元素构成的容器能容纳的最大水量。关键思路是使用双指针法:初始化时左右指针分别指向数组首尾,计算当前面积(两指针较小值×间距),并移动较小值的指针以寻找更大面积。通过逐步缩小范围,最终确定最大储水量。相比暴力解法(时间复杂度O(n²)),该算法优化至O(n)。示例代码展示了这一高效实现,通过比较指针值决定移动方向,确保每次迭代都更接近最优解。
2025-10-20 22:06:02
304
原创 283.移动零
本文介绍了一个将数组中的0移动到末尾的算法问题。要求在不复制数组的情况下原地操作,保持非零元素的相对顺序。通过双指针法实现:p0指向当前待处理位置,p1遍历数组。当p0位置为0且p1位置非0时交换元素,否则继续移动指针。示例展示了算法效果,如输入[0,1,0,3,12]输出[1,3,12,0,0]。关注公众号可获取完整解题代码。该解法时间复杂度O(n),空间复杂度O(1)。
2025-10-19 22:20:27
114
原创 128.最长连续序列
摘要:本文介绍如何找出未排序整数数组中最长连续数字序列的长度。通过排序去重后遍历数组,统计连续序列的最大长度。示例输入如[100,4,200,1,3,2]输出4(对应序列[1,2,3,4])。实现方法使用Arrays.sort排序,Math.max记录最大值,时间复杂度O(nlogn)。欢迎关注公众号获取更多学习资料。
2025-10-18 21:13:04
286
原创 49.字母异位词分组
题目要求将字母异位词分组。字母异位词指字母相同但排列不同的字符串。解决思路是对每个字符串排序,将排序后相同的字符串归为一组。例如["eat","tea","ate"]排序后均为"aet",归为一组。使用哈希表存储,键为排序后的字符串,值为原始字符串列表。最终返回哈希表中的所有值集合即可。时间复杂度O(nklogk),其中n是字符串数量,k是字符串最大长度。
2025-10-17 20:19:40
302
原创 手写简易版rpc框架
RPC(远程过程调用)框架的核心作用是将跨服务的远程调用变得像本地调用一样简单。文章通过电商App案例,演示了订单服务如何通过RPC调用用户服务,并详细拆解了RPC框架的四个关键组件:客户端、服务端、序列化组件和网络传输组件。随后逐步实现了一个简易RPC框架,包含服务注册、动态代理、序列化、请求处理等核心模块,最终通过Vert.x服务器完成服务调用测试。该框架采用JDK动态代理和Java原生序列化,展示了RPC的基本工作原理,为理解分布式系统通信机制提供了实践参考。
2025-10-17 11:24:48
930
原创 Centos7安装Docker(包成功下载镜像)
本文介绍了在CentOS7系统上安装Docker的完整步骤:首先确保虚拟机联网,更新yum源并安装依赖包;然后配置Docker的yum源,安装Docker社区版;关闭防火墙后启动Docker服务;为提高下载速度,配置了多个国内镜像加速器;最后通过加载配置文件和重启服务完成安装,并以拉取nginx镜像进行测试。文中还提供了相关问题的参考链接。
2025-09-16 09:31:01
254
原创 Git的安装和配置(idea中配置Git)
本文详细介绍了Git的安装、配置及常用操作。首先,推荐使用Git 2.40.x或更高版本,并提供了下载和安装步骤。接着,讲解了如何配置用户名和邮箱、创建本地仓库、克隆远程仓库以及文件操作指令。此外,还介绍了如何创建远程仓库、设置SSH公钥实现免密登录,以及如何在IDEA中配置Git并管理项目。最后,文章涵盖了分支与合并的操作,包括创建、切换、推送和合并分支,并提供了处理合并冲突的解决方案。通过本文,用户可以全面掌握Git的基本使用和高级操作。
2025-05-14 21:41:30
13300
原创 Spring Boot项目(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot前后端分离)
本文详细介绍了如何搭建一个基于Vue3和Spring Boot的前后端分离项目。前端部分使用Vue3框架,结合Element Plus组件库和Axios进行数据请求,并通过代理服务器解决跨域问题。后端部分使用Spring Boot框架,集成MyBatis Plus进行数据库操作,并配置了Druid数据源和分页插件。项目实现了家居信息的增删改查功能,前端通过表单进行数据校验,后端通过JSR303进行数据验证。文章还介绍了如何通过拦截器统一处理请求和响应,并详细说明了跨域问题的解决方案。最后,总结了项目使用的技
2025-05-11 18:56:43
1858
原创 实现SpringBoot底层机制【Tomcat启动分析+Spring容器初始化+Tomcat 如何关联 Spring容器】
当启动springboot程序时,通过netstat -anb命令查询得到。解决:在pom.xml文件中引入依赖 (刷新)创建HspMainApp作为主程序。运行该springboot程序。HiController类。通过浏览器发送请求得到。hspConfig类。
2025-04-23 09:40:31
505
原创 前端vue+后端ssm项目
本文详细介绍了如何搭建一个基于SSM(Spring、Spring MVC、MyBatis)和Vue的前后端分离项目。首先,项目的基础环境搭建包括新建Maven项目、配置pom.xml文件引入依赖、配置Tomcat环境以及配置Spring和MyBatis的整合。接着,通过逆向工程生成数据库表对应的Bean、Mapper接口和Mapper XML文件,并完成了家居信息的增删改查功能。前端部分使用Vue搭建,通过Element Plus组件库实现页面布局和交互,并通过Axios与后端进行数据交互。
2025-04-19 21:54:44
2402
原创 实现 MyBatis 底层机制【 封装 Sqlsession到执行器 + Mapper 接口和 Mapper.xml + MapperBean + 动态代理Mapper的方法
mybatis-config.xml: 进行全局配置,全局只能有一个这样的配置文件,XxxMapper.xml 配置多个 SQL,可以有多个 XxxMappe.xml 配置文件。在sqlSession包中增加方法,该类主要是实现 InvocationHandler 接口并重写动态代理对象调用的invoke方法,这个方法采用硬编码的方式,之后再完善。2、配置pom.xml文件(注意MySQL的版本,自己的版本是8.0,有些人的版本是5.1的)实现接口execute,用于封装SQL语句的查询方法。
2025-04-09 16:46:12
776
原创 实现 SpringMVC 底层机制【 核心分发控制器+ Controller 和 Service 注入容器 + 对象自动装配 + 控制器方法获取参数 + 视图解析 + 返回 JSON 格式数据 】
创建controller类 MonsterControllertry {writer.write("<h1>你好</h1>");创建自定义注解 Controller创建注解RequestMapping功能说明: : 如果给某个类加上, @Service, 则可以将其注入到我们的 Spring 容器编写自定义注解@Service/*** 该注解用于将Service层的对象注入到容器*/增加一个Service层@Service。
2025-04-03 16:14:10
630
原创 手动实现 Spring 底层机制 【初始化 IOC容器+ 依赖注入+BeanPostProcessor 机制+AOP】
最后在测试类中调试得到singleton中也有后置处理器对象,因为在原生的容器中,后置处理器是被当作一个主键 经历createBean和getBean方法,相当于将该后置处理器对象存储在singleton对象中然后再从该对象取出进行调用,但是现在为了方便调用后置处理器的方法,就直接将该对象放入list集合中,并在createBean方法中的初始化方法前后调用before和after方法。原生的后置处理器即使你返回的结果是空,他也不影响原来的初始化的对象。
2025-03-27 16:47:59
792
原创 手写简单的Spring基于注解配置的程序
新建一个包用于存放自己手写的程序创建一个自定义注解:ComponentScan/*** 这个自定义的注解的作用相当于原配置文件中的component-scan* @Target(ElementType.TYPE)表示该注解作用的对象* @Retention(RetentionPolicy.RUNTIME)表示该注解的生命周期表示注解的属性value用于存放包名(即:要扫描的包路径),默认是空字符串*/
2025-03-22 13:14:21
498
原创 韩顺平教育-家居网购
注意细节:1、将html修改为jsp文件时一定要加上下面的声明标签,否则会出现乱码!!!注意下载地址:https://download.youkuaiyun.com/download/2401_83418369/90467290MVC 全称。
2025-03-16 09:24:50
758
原创 tomcat的安装与配置(包含在idea中配置tomcat)
JDK 版本 下载对应的 Tomcat 版本对照表下载官网:Apache Tomcat® - Welcome!JDK 版本兼容的 Tomcat 版本支持范围说明早期兼容已淘汰,仅供历史参考。JDK 1.4JDK 1.4+Tomcat 5.5 需 JDK 1.4 或更高。JDK 5.0+Tomcat 6.x 最低需 JDK 5.0。Java SE 6JDK 6+Tomcat 7.x 需 JDK 6+(推荐 JDK 7+)。
2025-03-05 20:45:40
5618
10
原创 c3p0、Druid连接池+工具类 Apache-DbUtils (详解!!!)
数据库连接池是在应用程序启动时创建一定数量的数据库连接,并将这些连接存储在池中。当应用程序需要与数据库通信时,它可以向池中请求一个连接,使用完后将连接归还给池,而不是关闭连接。这样可以减少创建和关闭连接的开销,提高应用程序的性能。
2025-02-21 07:00:00
1999
使用Spring原生的组件实现springboot底层Tomcat的创建和spring容器的联系
2025-04-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅