- 博客(171)
- 收藏
- 关注
原创 Spring IoC & AOP 核心知识与原理(完整版)
IoC容器负责生产「原材料」(原始Bean对象),AOP机制负责对需要增强的原材料进行「精加工」(生成代理Bean),最终由IoC容器统一管理和对外提供「成品」(代理Bean)。解决「对象与对象之间」的依赖耦合问题,通过将对象的创建权交给容器,实现业务代码的解耦,让程序更易于测试、扩展和维护。IoC是Spring的骨架,所有功能都基于IoC容器展开。
2026-01-15 09:46:25
553
原创 【DataGrip打不开如何排查?】
先贴报错:。残留进程通常是因为之前的DataGrip没正常关闭(比如闪退、强制关闭、系统异常重启等)导致的。
2025-12-31 09:42:59
421
原创 【怎么理解maven中的镜像和仓库?】
把国外的东西,提前搬到国内仓库放着,你要的时候直接从国内拿,不用等跨国运输。镜像 = 在国内开了个分店,卖的东西和美国总店一样,但离你近,所以送货快!“别去美国那个慢吞吞的仓库了,去杭州那个仓库,东西一模一样,但快得多!这就是为什么配置镜像后速度能提升10-100倍的原因!我们用大白话、最直接的方式来解释这个问题。情况2:配置了镜像(就像国内超市有现货)情况1:没有镜像(就像网购国外直邮)好比GitHub vs Gitee。原因1:物理距离近(最核心!原因2:网络线路优化。用程序员能理解的例子。
2025-12-13 20:35:50
191
原创 【CapsLock 失效,Ctrl 键变成 CapsLock 的原因及解决方法】
许多笔记本电脑(尤其是联想、戴尔等品牌)在BIOS中默认开启了"Ctrl与CapsLock功能互换"选项,这是为了方便程序员和Linux用户的特殊设计。值可以自定义键盘键位。若该值被修改(如安装某些软件后),可能导致Ctrl与CapsLock互换。极少数情况下,键盘硬件本身损坏导致按键功能异常。:按住Shift键可临时输入大写,松开后恢复正常。Windows系统中,通过修改注册表的。
2025-12-13 14:29:43
1002
原创 【OOM是什么?怎么排查?】
OOM 是 JVM 抛出的要么是“内存分配太少,不够用”(比如堆内存设置太小,业务对象太多);要么是“内存泄漏”(对象用完后没被回收,一直占用内存,最终耗尽资源)。先看日志定类型,再抓快照找根源,配置不足就调整,内存泄漏就修复对 Java 开发来说,堆内存溢出(Java heap space)是重点,掌握“配置 JVM 参数自动生成快照→用 VisualVM/MAT 分析→修复内存泄漏/调整堆大小”的流程,就能解决 80% 以上的 OOM 问题。
2025-12-09 11:21:58
951
原创 【HashSet的本质是HashMap?】
HashSet 由 HashMap 实现,本质是“用 HashMap 的 key 实现 HashSet 的元素存储与去重,用固定空对象填充 HashMap 的 value”——核心目的是复用已有高效实现,减少开发维护成本,同时保持 Java 集合框架的设计一致性。简单说:HashMap 已经解决了“哈希表+去重”的核心问题,HashSet 不需要再造一遍轮子,只需要做一个“包装器”,把自己的方法转发给内部的 HashMap 即可。
2025-12-05 16:40:37
571
原创 【为什么加了锁会效率变低?Vector 是线程安全的,为什么现在不用了?】
要理解“加锁后效率变低”,核心是搞懂 synchronized,再加上锁本身的开销,最终导致效率下降。
2025-12-05 16:29:54
339
原创 【Lombok库常用注解】
Lombok是一个Java库,它通过注解的方式,在编译期自动生成样板代码,极大地减少了Java开发中冗长且重复的代码,如getter、setter、构造函数等,使代码更加简洁易读。
2025-11-24 13:27:42
427
原创 【匿名函数是什么?java中有匿名函数吗?】
无显式函数名:没有给函数起名字(比如是“命名函数”,是匿名函数);临时使用:通常作为参数传递(比如回调函数)或一次性执行,不用复用;语法简洁:省略函数名,聚焦核心逻辑(这是它的核心价值)。无显式名字、临时使用、简洁聚焦逻辑;Java 中没有独立的匿名函数(受“面向接口/类”设计限制);Java 通过两种方式实现匿名函数的效果:Java 8 前:匿名内部类(繁琐,依附接口/抽象类);Java 8 后:Lambda 表达式(简洁,依附函数式接口,推荐使用);
2025-11-17 16:36:30
791
原创 【JS中 箭头函数的核心优势:避免了传统匿名函数 this 指向混乱的问题、契合 Lambda 无副作用的特点】
/ 外部变量// 有副作用的函数:修改了外部变量 globalNum// 副作用:修改外部变量add(2, 3);// 15(外部环境被修改了)这个函数虽然能实现两数相加,但它修改了外层的globalNum,属于“有副作用”,不符合 Lambda 纯函数的思想。一个函数可以「解决了thisname: "张三",hobbies: ["篮球"],this.name = "李四";// 有副作用:修改了外部对象的属性。
2025-11-17 14:58:16
1011
原创 【什么是传统匿名函数?】
匿名」:函数没有自己的名字(比如是“命名函数”,是“匿名函数”);「传统」:相对于 ES6 箭头函数(() => {})而言,是 ES6 之前就存在的写法;function(参数) { 函数体 }(没有函数名,直接用function开头)。本质:无名字 +function关键字定义的函数,ES6 前的“匿名函数唯一写法”;核心用途:作为回调函数(如forEachsetTimeout)、赋值给变量复用、立即执行函数(IIFE);this动态绑定、有arguments对象、可作为构造函数;
2025-11-17 14:49:34
255
原创 【JS 有 lambda表达式吗】
JavaScript没有专门的Lambda表达式语法,但其箭头函数(() => {})完全实现了Lambda的核心功能。箭头函数作为匿名函数的简洁写法,完美契合Lambda表达式的三大特征:作为高阶函数参数、表达简单逻辑、实现纯函数。在数组操作(map/filter)、简化函数定义、异步回调等场景中,箭头函数与其他语言的Lambda表达式功能完全一致。虽然语法形式略有差异(使用=>符号而非lambda关键字),但JS箭头函数通过自动绑定this、不能用作构造函数等特性,充分体现了Lambda函数
2025-11-17 14:04:55
592
原创 StringBuilder 和 StringBuffer核心区别
单线程场景(90% 的开发场景,比如你的 SQL 拼接)优先用或字符串拼接/文本块(语法糖),性能最优、写法简洁;多线程场景(并发共享拼接)简单需求:用(自带锁,无需手动处理);高性能需求:用StringBuilder + 手动锁(比如或),锁粒度更灵活,避免全局锁的开销;线程安全换性能,无并发用 StringBuilder,有并发用 StringBuffer 或加锁的 StringBuilder。
2025-11-07 11:23:34
876
原创 【volatile】
想象有一个多人合作的项目,大家都在一个共享的办公室工作,办公室里有一块公共的白板,上面记录着项目的关键信息,比如项目进度、待办事项等。这块白板就好比是计算机内存中的共享变量。每个开发人员都有自己的办公桌(好比每个线程都有自己的工作内存),他们会时不时地去白板上查看信息,然后在自己的桌子上工作,完成一些任务后再把结果更新到白板上。但是,这里可能会出现一个问题:由于每个人都在自己的桌子上工作,有时候一个人更新了白板上的信息,其他人可能不会马上知道。
2025-10-17 15:04:27
155
原创 【Java序列化与反序列化详解】
→ 对象→字节序列;→ 字节序列→对象;(版本控制)、transient(排除临时字段);核心价值:支持数据持久化、网络传输、跨语言交互、缓存优化,是复杂Java程序(如分布式系统、客户端/服务器应用)的基础能力。
2025-10-16 17:20:52
775
原创 throw && throws
Java中throw和throws的区别: 用途:throw用于手动抛出异常,throws声明方法可能抛出的异常类型 语法:throw在方法体内使用,throws在方法声明中使用 处理:throw抛出的异常需要捕获,throws声明的异常由调用者处理 场景:throw用于主动抛出错误,throws用于传递受检异常 示例: void method() throws IOException { // 声明 if(error) throw new IOException(); // 抛出 }
2025-10-14 10:37:36
264
原创 【垃圾回收】
后,从程序逻辑上看这两个对象应该不再被使用,可被回收。但由于它们相互引用,按照引用计数法,它们的引用计数器值都不会变为0,导致这两个对象一直无法被回收,造成内存泄漏。所以,尽管引用计数法实现简单且判断效率较高,但由于这个严重缺陷,未被Java主流垃圾回收器采用。所指向的对象生命周期结束时,该对象的引用计数器值就会变为0,从而被认为是可回收对象。都指向同一个对象,该对象的引用计数器的值为2。引用计数法最大的问题在于无法处理对象之间的循环引用。,所以对象的引用计数器值减为1。,此时指向该对象的引用还剩。
2025-09-11 17:19:50
500
原创 【深入理解JVM】
JVM(Java虚拟机)是Java技术的核心,它实现了Java次编写,到处运行的平台无关性,通过将字节码转换为具体平台的机器指令。JVM负责内存管理,包括对象内存分配和垃圾回收,无需开发者手动管理内存释放。作为运行时环境,JVM通过解释执行或即时编译(JIT)技术执行字节码。其设计遵循Java规范,确保不同JVM实现上的程序兼容性。 关键JVM相关关键字: synchronized:实现线程同步,基于JVM的Monitor机制 volatile:保证变量可见性,防止指令重排序
2025-09-09 10:29:24
572
原创 【synchronized】
Java的synchronized关键字通过对象锁实现线程同步,确保线程安全。可使用方式包括修饰实例方法、静态方法或代码块,分别基于实例对象、Class对象或指定锁对象。JVM层面通过Monitor机制实现,字节码使用ACC_SYNCHRONIZED标志或monitorenter/monitorexit指令。JDK对锁进行了优化,包括偏向锁(减少同一线程重复获取的开销)、轻量级锁(CAS避免阻塞)和适应性自旋(动态调整自旋次数)。这些机制共同提升了多线程环境下的性能表现。
2025-09-04 09:42:44
877
原创 Java和数据库的关系
一个只会写Java代码但不懂数据库的工程师,就像一个物流调度员不知道仓库的容量、货架规则、叉车性能一样,他发出的指令很可能效率低下,甚至导致仓库瘫痪(数据库瓶颈)。数据库(MySQL, Oracle等) 就像一个专业的仓库,它有自己的管理体系、安保措施(权限)、货物摆放规则(索引)和进出流程(事务)。数据库本身是一个独立的、巨大的知识领域,但“数据库的使用、优化和深度理解”绝对是Java后端工程师进阶的核心组成部分。Java后端程序 就像是操作这个仓库的整个物流系统,包括下单、调度、打包、运输等。
2025-08-23 21:55:20
338
原创 (existing, replacement) -> existing
是 Java 中处理 Map 键冲突的合并函数,主要用于等需要处理重复键的场景。这是一个existingexisting当使用定义当时,如何处理值的冲突。
2025-07-04 17:21:20
403
原创 关于Stream
Stream API 通过中间操作和终止操作的组合,提供了一种高效、灵活且易读的方式来处理集合数据。掌握这些操作可以让你的代码更简洁、更具表现力。
2025-05-07 15:07:07
1196
原创 SSM和SpringBoot有什么区别?
undefined.应用程序的度量指标,如请求的处理时间、吞吐量等。通过访问特定的 URL 路径(端点路径),就可以获取到相应的监控和管理信息。undefined.应用程序的配置信息,如环境变量、配置属性的值。总之,Spring Boot 是在 SSM 等传统框架基础上发展而来,更适合快速开发和部署现代化的 Java 应用。端点用于获取应用的健康状况, /actuator/info 端点用于获取应用的自定义信息。undefined.应用程序的健康状况,包括数据库连接、缓存状态等方面的健康检查结果。
2025-02-25 10:15:23
751
原创 Hosts 和 DNS
DNS(Domain Name System,域名系统)和 hosts 文件都与域名解析相关,它们相互协作又有各自的特点,下面为你详细介绍它们之间的关系。
2025-02-12 11:11:53
703
原创 【回调函数】
回调函数是编程中一种重要的概念,特别是在处理异步操作时。它是一种在某个操作完成后执行的函数,这个操作可能是耗时的I/O操作,如网络请求或文件读写,也可能是任何需要在稍后执行的任务。
2024-09-10 17:22:47
386
原创 UNION 和 UNION ALL
语句必须有相同数量的列,并且每列的数据类型必须兼容。列的顺序和数据类型也必须一致,这样才能保证结果集的正确合并。中有重复的行,这些重复的行也会出现在合并后的结果集中。语句的结果合并成一个单一的结果集,包括所有重复的行。是一个SQL操作符,用于合并两个或多个。它的工作原理是将每个。会自动去除重复的行,而。会保留所有重复的行。
2024-07-11 10:23:13
949
原创 迭代器 增强for循环
这里的关键是,这个操作是安全的,因为它是由迭代器自己管理的。迭代器会记录下它所在的集合的状态,并在调用 remove() 方法时进行相应的更新,以避免并发修改异常。
2024-05-23 13:57:51
1464
原创 Stream API 和 Lambda表达式
总结来说,Java 8 Stream API提供了一种新的数据处理方式,而Lambda表达式提供了一种新的代码表达方式。两者结合使用,可以写出更简洁、高效的代码。在这个示例中,使用Stream API和Lambda表达式来处理一个字符串列表,筛选出以"A"开头并转换为大写的字符串,并将结果收集到一个新的列表中。
2024-05-21 13:37:50
466
原创 flatMap方法:扁平处理流
方法就像是这样一个助手:它帮你打开每个信封,取出所有的小纸条,并把它们放在一起,形成一个没有信封的、平铺的小纸条列表。这样,你就得到了一个包含所有小纸条的单一列表,而不是之前那些装有小纸条的多个信封。flatMap是一个流操作,它接受一个函数作为参数,这个函数会被应用到流中的每个元素上,并且这个函数返回的每个结果都是一个流。flatMap然后将这些流扁平化成一个流。现在,你想要把所有的小纸条都取出来,整理成一个新的、没有信封的列表。假设有一系列的信封,每个信封里面都装着一些小纸条。这些信封相当于我们的。
2024-05-21 10:57:43
548
原创 putIfAbsent() 方法
这个方法非常有用,特别是在不希望覆盖现有键值对的情况下,或者在需要检查键是否已经存在于。中,并返回之前与该键关联的值(如果有的话)。如果键不存在,则返回。接着,我们尝试添加 “cherry”,由于它不存在,所以添加成功,,也不会返回任何值。只有当键不存在时,它才会将指定的键值对添加到。返回了之前与 “apple” 关联的值(即 1),而没有修改。并添加了两个键值对。然后,尝试将 “apple” 添加到。中添加一个键值对,前提是这个键尚未存在于。接口的一个方法,它用于向。中,但由于它已经存在,
2024-05-17 09:22:39
740
原创 Debug技巧-不启用前端访问后端
在日常开发中,我们经常会遇到各种问题需要调试,前后端都启动需要耗费一定的时间和内存,方便起见,可以直接用抓包数据访问后端,这里我们需要用到Postman或者ApiFox。
2023-11-01 10:47:42
724
原创 Git 常用
*注意:**git restore 是 Git 2.23 版本引入的一个命令,如果你使用的是较早版本的 Git,可能无法使用 git restore 命令,但你仍然可以使用。**注意:**git switch 是 Git 2.23 版本引入的一个新命令,如果使用的是 Git 的旧版本,可能无法使用 git switch 命令,但仍然可以使用。命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
2023-09-07 16:29:49
788
原创 JRebel and XRebel 区别
XRebel:请求过程中,各个部分代码性能监控。例如:方法执行时间,出现的异常,SQL执行时间,输出的Log,MQ执行时间等。JRebel:修改完代码,不想重启服务,期望代码直接生效。
2023-08-11 14:31:14
751
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
2