自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 无侵入式代码增强定义

无侵入式代码增强(Non-intrusive Code Enhancement)是一种在不修改原有业务代码的前提下,为代码增加新功能 / 特性的编程思想和实现方式。

2025-12-29 12:25:56 98

原创 Java序列化和反序列化

序列化是 对象转可存储 / 传输格式(如 JSON 字符串),核心解决 对象无法直接存储 / 传输 的问题;反序列化是 格式转回对象,核心解决 序列化后的数据无法直接使用 的问题;

2025-12-28 21:05:47 112

原创 垃圾回收算法有哪些

基础算法是“工具”,分代回收是“策略”—— 复制算法快、无碎片但费内存(适合年轻代);标记-清除高效但有碎片(适合老年代日常);标记-整理无碎片但慢(适合老年代碎片清理);分代回收则是把这些工具组合起来,适配不同区域的对象特性,实现整体 GC 最优。

2025-12-01 15:32:08 1007 1

原创 JVM内存

● 以 native 修饰的方法就是本地方法,本地方法不是用Java写的(没有方法实现的,只有一个接口供Java调用),而是用C或C++编写,因为 Java 有些时候不能直接和操作系统底层打交道,因此Java通过接口间接调用C或C++编写的本地方法来与操作系统底层的API打交道。解决方案:所以引入了TLAB的概念,Threal Local Allocate Buffer,是每个线程在Eden区专属的一块区域,当线程的TLAB区域未满时,可以直接在其中分配内存,不需要加锁,提高内存分配速度。

2025-12-01 10:13:04 548

原创 什么是开闭原则

对扩展开放(Open for Extension)当软件需要新增功能或行为时,可以通过增加新的代码(如新增类、方法)来实现,而无需修改已有的、稳定运行的代码。对修改关闭(Closed for Modification)一旦软件实体(如类)被设计并测试完成,就不应再随意修改其内部实现(如修改现有方法、新增/删除字段),以避免引入新的 bug 或破坏已有功能。核心目标通过“扩展”而非“修改”来应对需求变化,保证系统的稳定性、可维护性和可扩展性。开闭原则的核心是用抽象隔离变化,用扩展应对需求。

2025-11-24 11:05:42 524

原创 POJO,DTO,Entity,VO

VO 是专门为。

2025-11-24 11:03:35 933

原创 github访问响应时间过长解决

github访问响应时间过长,安装了这个插件,感觉有用,Microsoft Edge扩展插件:iLink。

2025-11-08 15:43:56 250

原创 Java分层解耦(Controller,Service,Mapper)【待完善】

2025-10-30 13:42:33 116

原创 JWT令牌

是一种基于JSON的轻量级令牌格式,用于在网络应用间安全传递声明信息(如用户身份、权限等)。它通过数字签名保证信息的完整性和真实性,且自包含(令牌本身携带所有必要信息),无需服务器存储状态,非常适合前后端分离、分布式系统的身份验证场景。

2025-10-30 11:33:09 804

原创 SQL 查询语句的子句的执行顺序

SQL查询语句的执行顺序与书写顺序不同。执行时首先确定数据源(FROM/JOIN),然后依次进行WHERE过滤、GROUP BY分组、HAVING筛选分组、SELECT选择列、DISTINCT去重、ORDER BY排序,最后LIMIT限制结果行数。例如:先筛选价格>50的产品,按类别分组计算平均价,再筛选平均价>100的类别,最终返回前5条排序结果。理解这一执行逻辑有助于编写高效的SQL查询。

2025-10-29 17:26:53 336

原创 什么是慢SQL

慢 SQL 是执行时间超过预设阈值、消耗大量数据库资源的 SQL 语句,常见特征包括长时间执行和占用高 CPU、IO 或锁资源。产生原因主要包括索引缺失或失效、SQL 写法不当、数据量过大及配置不合理。慢 SQL 会导致数据库性能下降、连接耗尽甚至业务瘫痪。识别方法包括开启慢查询日志和使用监控工具。优化策略涵盖索引优化、SQL 改写、表结构调整和缓存应用等,其中通过 EXPLAIN 分析执行计划是关键预防手段。

2025-10-29 17:11:53 602

转载 Jmeter压测看到的【博客整理】

三篇教程全面介绍了JMeter压力测试工具的使用方法,包含基础配置、线程组设置、监听器运用等核心功能。内容涵盖创建测试计划、添加HTTP请求、设置并发参数、查看结果分析等完整流程,提供从零基础入门到实战应用的详细指导。教程均采用分步式讲解,配有清晰的图文说明,适合测试新手快速掌握JMeter进行性能压力测试,包括Web应用接口和服务的并发负载测试等场景。

2025-10-29 16:25:45 29

原创 Java创建【线程池】的方法

创建线程池的核心是通过手动配置参数(核心线程数、最大线程数、有界队列、拒绝策略等),根据业务场景(任务类型、并发量、资源限制)合理设置,避免使用Executors带来的资源风险。线程池的核心价值是复用线程、控制并发,是高并发场景下的必备工具。

2025-10-29 16:22:52 978

原创 Java Web 开发的核心组件:Servlet, JSP,Filter,Listener

这些组件是 Java Web 开发的“官方标准”,由 Java EE 规范定义,所有 Web 容器(如 Tomcat)都必须支持,是构建 Web 应用的基石。底层规范组件(Servlet、JSP、Filter、Listener):定义请求处理、视图生成、拦截监听的标准;业务分层组件(JavaBean、DAO、Service、Controller):实现数据封装、数据访问、业务逻辑、请求调度的分层设计;运行环境组件(Web 容器、配置文件):提供运行基础和配置支持。

2025-10-28 20:11:34 756

原创 Java电商项目中的概念: 高并发、分布式、高可用、微服务、海量数据处理

摘要:Java电商系统的核心能力包括高并发、分布式、高可用、微服务和海量数据处理。高并发通过限流、缓存、异步化和负载均衡应对秒杀等高流量场景;分布式架构采用服务拆分、通信机制、事务和锁保证协同可靠性;高可用依赖集群化、熔断降级和数据备份确保服务连续性;微服务按业务拆分实现独立开发部署;海量数据处理运用分库分表、实时/离线计算框架。这些技术协同工作,共同支撑电商大促等复杂场景下的系统稳定性。(150字)

2025-10-27 21:11:57 786

原创 Java的中间件

摘要:Java中间件是独立运行的服务软件,用于解决分布式系统中的通用问题,如通信(Netty、Dubbo)、消息队列(Kafka、RabbitMQ)、缓存(Redis)等,按功能可分为7大类。Redisson并非中间件,而是Redis的Java客户端工具库,提供分布式锁等高级API,简化操作但需嵌入应用运行。中间件与客户端工具的区别在于是否独立部署。

2025-10-27 10:47:22 685

原创 数据库CRUD的概念

CRUD是数据处理的四大核心操作,包括新增(Create)、读取(Read)、更新(Update)和删除(Delete)。它构成了所有数据驱动应用的基础功能,如微信添加联系人(C)、查看通讯录(R)、修改备注名(U)或删除短信(D)。电商平台的商品发布、查询、调价和下架同样是CRUD的典型应用。这些操作组合实现了日常软件的数据管理功能。

2025-10-27 09:36:19 197

原创 死锁避免和死锁检测

本文对比了死锁避免和检测两种策略。死锁避免采用银行家算法进行事前预防,通过安全性检查确保系统始终处于安全状态。死锁检测则通过资源分配图(单资源)或等待图(多资源)算法事后识别死锁,前者检测资源-进程图中的环,后者分析进程间的等待关系。两种方法各有侧重,银行家算法理论性强但实际应用受限,检测算法更灵活但需配合恢复机制。文中配有示意图说明关键概念。

2025-10-22 16:46:44 500

原创 DNS解析

DNS解析是将用户易记的域名转换为计算机可识别的IP地址的过程。解析过程分为递归查询(主机向本地DNS服务器发起请求)和迭代查询(本地DNS服务器依次查询根域名服务器、顶级域名服务器和权限域名服务器)。最终通过多级查询获取目标IP地址,完成域名到IP的转换。

2025-10-21 09:38:24 161

原创 MSS【TCP报文里‘数据部分’的最大允许长度】

注意:如果TCP头或IP头包含“选项字段”(如TCP的窗口缩放选项、IP的TTL调整选项),头部长度会增加,此时MSS会相应减小(比如TCP头带12字节选项,MSS就变成1460-12=1448字节)。而MSS的作用就是提前“适配MTU”:TCP在建立连接时协商MSS,确保“TCP报文段(TCP头+数据)+ IP头”的总大小不超过MTU,从根源上避免IP分片。● MTU是数据链路层(如以太网)规定的“单个数据帧所能承载的最大IP数据包大小”(以太网默认MTU=1500字节,即一个IP包最大1500字节)。

2025-10-11 14:42:38 522

原创 Protobuf

Protobuf(全称 Protocol Buffers)是 Google 开发的一种高效的结构化数据序列化协议,用于将结构化数据(如对象、消息)转换为紧凑的二进制格式,以便在网络传输或本地存储中高效地交换和存储数据。,已成为后端服务间通信(如 RPC)、数据存储的主流选择(例如 gRPC 框架默认使用 Protobuf 作为数据交换格式)。

2025-10-11 14:40:11 370

原创 交换机&路由器

路由器是 “跨网络的网关”,负责不同网络之间的通信转发。● 路由器:核心是 “连接不同网络”,比如家里的路由器一边连 “运营商的公网”,一边连 “家里的内网(手机、电脑)”;公司的路由器连接 “内网” 和 “互联网”—— 相当于 “不同网络之间的‘关卡’,负责数据在不同网络间的进出和指路”。● 交换机:仅工作在同一局域网(LAN) 内,比如家里的 “千兆交换机” 连接电脑、打印机、NAS,公司机房的交换机连接多台服务器 —— 本质是 “把局域网内的设备‘串’起来,让它们互相通信”,无法连接外网或不同网段。

2025-10-11 14:39:26 527

原创 b树,b+树,红黑树

*查询:**时间复杂度都是O(logN),红黑树小于AVL树(因为AVL树高度差不超过1,红黑树不超过两倍,即AVL树平衡要求更严格,所以红黑树查询效率更慢)MyISAM 引擎的索引与 InnoDB 有本质区别:数据和索引完全分离存储 (数据存在.MYD文件,索引存在.MYI文件),且无论主键索引还是二级索引,红黑树是一个二叉搜索树,它和AVL树一样,都是对二叉搜索树进行了平衡,只是平衡的策略不同。访问节点在硬盘上进行,节点内查找在内存上进行,树高就是读取硬盘的次数。(偏移量),而非完整数据或主键值。

2025-10-11 13:54:32 1037

原创 进程、线程、内存、调度总结

总结多篇博客

2025-10-04 20:13:21 976

原创 科大讯飞Java开发【牛客网真实面经整理】

以下是我自己搜集的比较全面的牛客网上的面经,然后用deepseek生成的答案,分享一下。

2025-09-11 15:03:54 889

原创 黑马JavaWeb【复习到哪更新到哪】

就是loginController->service层->mapper层,从数据库中查找username和password是否和前端用户提交的表单内容一致,一致就登录成功,否则就返回登录失败的信息。

2025-07-28 20:11:52 913

原创 【leetcode 100】贪心Java版本

i之间的所有位置,看它最远能到哪里,然后看最后能超过n-1,超过了说明能跳到n-1。但是又是很模糊的感觉,不知道具体怎么去“遍历”。注意思路是维护的是一个变量即最远能到达的位置,不是为每个位置都维护,这与上一题不同,上一题记录的是每个字母最远能到的位置。我的思路:第一次没有一点思路,第二次看了官网思路后,写的以下答案,没有搞明白循环遍历,此处贪心的思路是:有多个可以跳到最后一个位置的情况时,也就是对应下标最小的那个。我的思路:加入从0跳到第i个位置,那么0。我写的有问题:超出时间限制(待解决)

2025-04-08 22:23:44 512

原创 力扣hot100【链表】

思路:公式推导(根据链条长度和快的是慢的两倍关系,推导环内长度与环外长度的倍数关系),再找快慢指针先相遇的地方,根据公式长度倍数关系,设置第三个指针,然后第三个指针与慢指针同时遍历,直到相遇的地方就是环的入口。我的思路,双指针,相差N但是卡了bug进行了边界处理,而且多了一个没必要的pre指针,其实不好,不通用,官方的双指针用了虚拟头节点。我的思路:两个链表一长一短,先把长的提前遍历使两个链表的长度相等,然后同时遍历,如果遍历的节点相等时说明相交,否则不相交。官方:没看,三种方法。没思路,直接看的答案。

2025-04-08 22:20:54 1010

原创 【leetcode100】动态规划Java版本

又想的是要连续的话,如果后一个和前一个相乘结果变小了,那就段了,从dp[i]从头开始了,先把用nums数组初始化dp,dp[i]表示的就是i前面最大的连续乘积,但是这种方法也不对,比如例子:【-2,3,-4】我的输出就是3,而正确结果是24,错误原因:我相当于把nums整个数组分割成每一个小段了,只比较了的dp[i-1]*nums[i]和dp[i-1],相当于只考虑了前一个数字,没有整个考虑。其他的错误的想法:以为dp[i]=dp[i-1]+1;从第i-1到第i个只有dp[i-1]的方法。

2025-04-04 19:42:24 871

原创 递归类问题(待补充)

5. 注意该问题因为是栈中元素有序,所以可以递归解决6. 该问题数据结构是栈,顺序存储的元素,与单链表不同,单链表递归可能会考虑它的上一个结点。不过递归尽头都是单一的一个元素如何解决。7. 关于问题规模:数组直接传递参数n, 单链表传递的是linklist->next,(所以不需要n,自己本身的数据结构直接减一了)PS:做题记录//14.13-14.35思考递归未果//14.35-14.43用其他方法解除//14.43-14.39思考递归未果,看答案。

2024-11-21 14:34:43 738

原创 【代码随想录】哈希

当我们需要枚举数组中的两个元素时,如果我们发现随着第一个元素的递增,第二个元素是递减的,那么就可以使用双指针的方法,将枚举的时间复杂度从 O(N^2)减少至 O(N),如本题和为固定值0,a,和值不变,b增大,c减小。对两个数组排序的时间复杂度分别是 O(m log m)和 O(nlog n),双指针寻找交集元素的时间复杂度是 O(m+n),因此总时间复杂度是O(mlogm+nlogn)。不能用双指针,首先,要返回的是原来的坐标,如果先排序再用两数之和,那么返回的left和right就是排序后的坐标。

2024-11-21 14:32:37 1081

原创 【代码随想录】字符串 (KMP,BF ,扩充数组,for循环固定规律一段处理,整体反转+局部反转,双指针,滑动窗口,库函数)

使用了一个标志来看是否进入了单词区,我使用的是pos标记第一个单词字符位置,用i标志单词的最后一个字符,没有使用标志进入单词区。精妙之处在于双指针的终止条件是i==j相等,因为扩充的是空格的个数,所以相当于i在追j,当追上之后说明空格已经被填满了,前面没有空格了,可以停止,而不是i>=0作为i停止条件。随想录使用的是&,因为最后用了resize()重新定义了大小,所以可以用引用!本题目是将一个字符换成三个字符,使用char类型的数组,该数组长度为原来数组的三倍(最大全替换),最后再返回为真实长度的数组。

2024-11-21 14:32:15 1081

原创 【代码随想录】链表: 递归,虚拟头结点,双指针,栈,哈希

递归深入是压栈的过程,直到链表的最后一个节点的next,然后开始返回,返回到最后一个节点本身,再判断,当前节点(最后一个节点)的值是否等于val,如果等则返回他的next,那么到一上层倒数第二个节点,它的next值就是倒数第一个节点的next;所以是从后往前删除的,因为是删除,所以你要知道它的上一个节点,递归的调用赋值给head->next,即head->next= removeELements(X,X), 而递归参数应该是head->next, 因为要保证该节点的后面所有节点都是没有val的。

2024-11-21 14:14:37 770

原创 【代码随想录】栈,队列(双端队列,单调队列,单调栈,优先级队列)

stack 和queue 是容器适配器,底层容器可为deque,list,vector来实现,默认是deque双端队列,提供O(1)的push_back(),而vector提供均摊的O(1)

2024-11-21 14:13:20 927

原创 【代码随想录】树的遍历题目

针对二叉树的问题,解题之前一定要想清楚究竟是前中后序遍历,还是层序遍历。二叉树解题的大忌就是自己稀里糊涂的过了(因为这道题相对简单),但是也不知道自己是怎么遍历的。

2024-11-21 14:12:09 1113

原创 【代码随想录】树的构建题目

106. 从中序与后序遍历序列构造二叉树题目题目思路:【随想录】搞清楚人做的时候的逻辑:在后序数组中找到最后一个当作根节点利用这个根节点到中序数组中找到该点,作为分割点,将中序数组分割成左右两个利用中序数组的左右数组,再到后续中继续进行分割难点:每次递归的左右区间边界点要弄清楚,即循环不变量,这里用的左闭右开区间。**以下是看了思路后写的,不太对!少了很多东西主要问题是划分边界值,以及少了对特殊节点的判断(空树),大逻辑正确,代码里的注释是错误点反思。class Solution

2024-11-21 14:11:45 686

原创 【代码随想录】回溯

剪枝操作是根据k和n的值来做的,比如k=4,n=4,那么for循环时,只会有一个解即:1 2 3 4,即从1开始的for循环有结果,而从2开始之后的for循环都没用,不可能是解,因为后面取得数个数一定比4小,所以这种情况就可以剪枝,在for循环得startindex上做文章(结合随想录的树形图,注意一个矩形就是一个for循环!回溯的解决方法都可以抽象成为树形结构,回溯法解决的问题都是在集合中找子集的问题,集合的大小就是树的宽度,递归的深度就是树的深度,递归必然有终止条件,因此一定是一个深度有限的N叉树。

2024-11-21 14:11:12 994

原创 【代码随想录】滑动窗口

看的官方题解评论区,发现,每次left可以直接从下一个相同字符的下一个开始,使用map<char,int> int 记录每个字符的位置,出现相同字符则记录的是该字符出现的上一个位置,如abcdefdgh, 当遇到第二个d时left会跳到e, 因为在a-第一个d之间的连续字串的长度都比a-d小,所以这是不必要的循环,直接跳到第一个d的下一个。4. 哈希表如何构造?请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

2024-11-21 14:10:44 871

原创 【代码随想录】动态规划

2.dp表达式,不用管之前的是否有障碍物即dp[i-1][j],dp[i][j-1], 只需要保证当前计算的dp[i][j]是没有障碍物的。dp[i][j]=dp[i-1][j]+dp[i][j-1]. dp[i][j]可以表示为dp[i-1][j]向下移动一格,或者是dp[i][j-1]向右移动一格。dp[i-j](这里dp[i-j]表示分解数字i-j,得到的最大乘积为dp[i-j]也就是基于之前得到的结果进行的)初始化:dp[0][0]=0 dp[0][1]=1;dp[1][0]=1;

2024-11-21 14:09:53 1056

原创 【代码随想录】贪心

如果当前股票price[i]>buy,说明可以卖出并获得price[i]-buy的收益,但是该结果不一定是最优的,因为后面可能会出现比price[i]还高的价格,所以可以看成是当前我用price[i]买了一只股票,即将buy更新为price[i]-free,后面如果出现了新的高的价格即price[i+1]>price[i]时,就会累加收益price[i+1]-buy (buy=price[i]),相当于是price[i+1]-price[i]k>负数个数时,且数组中有0时,就将多余的k弄到0身上;

2024-11-21 14:09:08 1276

空空如也

空空如也

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

TA关注的人

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