- 博客(26)
- 问答 (3)
- 收藏
- 关注
原创 Builder Pattern
这段代码的核心:通过建造者模式构建一个配置完整的 AI 服务实例,针对 VUE_PROJECT 场景配置了流式模型、记忆功能、文件工具和错误策略。建造者模式的核心:将复杂对象的「构建步骤」和「最终创建」分离,解决多参数构造的可读性、灵活性问题。链式调用的原理:建造者的每个配置方法都返回this(建造者自身),使得调用可以连续串联。建造者模式在实际开发中非常常见(比如 Java 的、MyBatis 的、Spring 的),核心思想都是「分步配置、统一构建」,而链式调用则是让这个过程更优雅的语法糖。
2026-02-14 12:20:16
321
原创 @EqualsAndHashCode(callSuper = true)
让 Lombok 生成的equals()hashCode()包含父类字段;核心解决 “子类比较时忽略父类字段导致的逻辑错误” 问题;只要实体类继承了含业务字段的父类,就必须显式设置。简单说,这个配置是为了让生成的相等性判断逻辑更 “完整”,符合我们对实体对象相等性的认知。
2026-02-02 16:18:48
641
原创 MySQL联合索引
回表是二级索引查询时,需要通过主键再查整行数据的额外操作,会降低性能;该联合索引利用覆盖索引特性,对的游标查询(分页 / 滚动加载),要么完全避免回表,要么大幅减少回表次数;这是针对 “按应用 + 时间范围查询对话记录” 这类核心场景的性能优化,也是标注为 “游标查询核心索引” 的原因。
2026-02-02 00:11:12
385
原创 nginx静态资源
这段配置定义了一个 Nginx 的server监听本地 80 端口,提供静态资源访问服务;以为根目录托管静态文件;支持 “多项目” 目录结构(每个子目录对应一个前端项目),并适配前端 SPA 的 history 路由模式(非真实文件路径自动指向项目的index.html确保各类静态文件(CSS/JS/JSON 等)的 UTF-8 编码,避免乱码。核心作用:搭建 80 端口的静态资源服务器,支持多项目托管,适配前端 SPA 的 history 路由模式;关键指令root指定资源根目录,
2026-01-31 16:29:13
402
原创 Spring BeanUtils.copyProperties 与 Hutool BeanUtil.copyProperties 的对比
浅拷贝问题:需要特别注意,无论是Spring还是Hutool的拷贝工具,默认都是浅拷贝(shallow copy)。如果被拷贝的属性是对象或集合,复制的是引用而非创建新对象。对性能有极致要求:如果拷贝操作非常频繁且性能至关重要,可以考虑MapStruct或Cglib BeanCopier这类在编译期或通过字节码生成实现拷贝的方案,它们的性能远超基于反射的工具。追求简单快捷,且项目已集成Spring框架:直接使用 Spring BeanUtils 是不错的选择,它能满足大部分基础场景,避免额外依赖。
2025-11-27 13:20:24
206
原创 Stream终端操作和中间操作
特点: 返回具体结果或 void,不返回 Stream。执行方式: 惰性求值,只有遇到终端操作时才真正执行。特点: 返回另一个 Stream,支持链式调用。执行方式: 立即执行整个流水线。// 结果: true。
2025-11-21 17:34:09
310
原创 MyBatis参数绑定解析:单对象、集合与多对象参数的访问规则
不可以写成{setmeal.id} ,这意味着 MyBatis 需要在参数对象中找一个叫 setmeal 的属性, 然后获取它的 id 子属性,但实际传入的参数就是 setmeal 对象本身,它没有名为 setmeal 的属性,只要是单参数情况,都应该直接使用 #{属性名} 的形式访问参数属性。@Param(“order”) Order order 将 order 对象命名为 order。#{order.userId} 访问 Order 对象的 userId 属性。用户表 (users)
2025-10-30 22:01:35
244
原创 java过滤器和拦截器之间的区别
方面过滤器 (Filter)拦截器 (Interceptor)核心定位Web容器的“门卫”,处理所有进出的流量。Spring MVC的“管家”,管理进入Controller的请求。技术层级更底层,Servlet规范。更上层,Spring框架。控制粒度粗粒度,针对请求和响应本身。细粒度,可以获取到Spring的上下文(如Controller, Handler等)。灵活性相对较低,不能使用Spring的便利功能(如依赖注入)。非常高,与Spring生态无缝集成。在实际项目中,它们通常协同工作。
2025-10-11 12:36:23
357
原创 左外链接查询on和where的区别
特性ON子句 (针对右表)WHERE子句 (针对右表)执行时机连接过程中连接完成后主要作用定义连接条件,决定如何匹配对最终结果集进行行级过滤对左表的影响不影响左表记录数量,左表所有记录都会被保留会影响左表记录数量,不满足条件的行(包括右表为NULL的行)会被过滤掉最终效果仍然是真正的左外连接效果上类似于内连接,失去了左外连接保留所有左表记录的意义。
2025-10-07 13:52:41
859
原创 group by后select只能写字段名称和聚合函数
Alice 的 North 销售记录被合并为一组,Bob 的 North 和 South 销售记录被分成两个独立的组。是 PostgreSQL、SQL Server 2017+ 等的函数,MySQL 中用。如果你不关心具体是哪个区域,只想知道Bob涉及的。如果我们想同时查看每个销售员所在的区域。,其他数据库有类似但不同名的函数。MySQL 在默认配置下有一个。要理解这个规则,首先要明白。的组合进行更细粒度的分组。列表中出现非聚合且不在。,可以使用聚合函数。
2025-09-18 12:27:50
550
原创 Mybatis的提供的符号一个是 #{...},另一个是 ${...},两者区别
动态排序:ORDER BY ${sortBy} (注意:即使在这里,排序方式ASC/DESC也最好别让用户控制,或者要做严格的校验和白名单过滤)动态表名/列名:SELECT * FROM ${tableName} ORDER BY ${columnName} DESC。绝大多数场景使用 #{}:尤其是传递 WHERE条件中的值、INSERT语句中的VALUES。不得已时使用 ${}:只有当需要动态指定数据库对象名(表名、列名) 或 SQL关键字 时。动态分组:GROUP BY ${groupBy}
2025-09-17 09:32:28
157
原创 where和having与聚合函数的使用
WHERE 就像是老师在计算总分之前,先把缺考的学生(score IS NULL)或者分数极低(score < 20)的试卷挑出来放到一边。他此时还无法判断谁的总分最高,因为他一张总分还没算。HAVING 就像是老师在算出所有学生的总分之后,再根据总分进行筛选,比如:“找出总分大于 200 分的学生”。他现在可以这么做了,因为他已经拥有了“总分”这个聚合后的数据。GROUP BY 和聚合函数就像是老师开始计算每个学生的总分(SUM(score))。
2025-09-12 20:24:13
188
原创 <? extends T>与<? super T>的使用
这意味着集合中的元素必须是 T 或更广泛的类型(比如 Object),因此我们可以安全地将 T 或其子类的元素添加到集合中。extends Number>(上界通配符),你可以从 list1 中安全地读取 Number 或其子类(如 Integer),但不能向 list1 中写入 Number 或其子类,除非是 null。读操作:允许你安全地从容器中读取 T 类型的数据,因为容器中的元素都继承自 T。写操作:允许向容器中写入 T 类型或其子类型的元素,因为容器可以接受 T 及其子类的元素。
2025-07-06 09:59:54
1053
原创 Java native方法
在 Java 中,native 方法是一个关键概念,它表示该方法的具体实现并非由 Java 编写,而是由其他语言(如 C、C++ 或汇编)实现并通过 JNI(Java Native Interface) 与 Java 交互。程序计数器属于 JVM 栈管理范畴,在本地方法栈中无对应概念。具体逻辑在 外部本地库(如 .dll(Windows)、.so(Linux)、.dylib(macOS))中。在 Java 虚拟机(JVM)中,程序计数器(Program Counter Register) 的值在执行。
2025-06-29 10:14:31
1153
原创 Java压缩流和解压缩流
它负责将 ZIP 条目(ZipEntry)写入压缩包,并准备接收文件数据。解压的本质:把压缩包里面的每一个文件或者文件夹读取出来,按照层级拷贝到目的地当中。2.元数据写入:将 ZipEntry 的元数据写入 ZIP 文件。ZIP条目(ZipEntry)的本质:路径与文件的统一体;表示当前 ZIP 条目(文件或目录)的处理已经完成。作用:获取ZIP中的下一个条目(文件或目录)1.条目初始化:开始写入新的 ZIP 条目。作用:创建一个指定名称的 ZIP 条目。(entry.是ZipEntry类)
2025-06-26 21:59:17
799
原创 try-with-resources 语句详解
3)可以通过主异常获取抑制异常,即e.getSuppressed()方法,这是 Throwable 类的方法,返回一个包含所有抑制异常的数组,如果没有任何抑制异常,返回空数组(非 null)。try-with-resources 是 Java 7 引入的一种异常处理语法,用于自动管理资源(如文件流、数据库连接等),确保资源在使用后被正确关闭,无需显式编写 finally 块。即使 fr 和 fw 已在外部定义,仍需在 try 内重新声明新变量(如 r1、w1),导致冗余代码1。
2025-06-25 19:48:31
951
原创 在 Java 中,finally 块中的 return 语句会覆盖 try 块中的返回值
2.避免在 finally 中使用 return:这可能导致意外的行为(如屏蔽 try 中的异常),通常建议在 finally 中仅做清理操作(如关闭资源),而不是返回语句。3.如果 try 中抛出异常,但 finally 中有 return,该异常会被忽略(因为 finally 的 return 会正常结束方法)。在 Java 中,finally 块中的 return 语句会覆盖 try 块中的返回值。2.接着强制进入 finally 块执行(finally 始终会执行)。方法实际返回 20。
2025-06-25 14:00:21
363
原创 调用抛出受检异常的方法时,调用者必须在编译时提供处理方案——要么自己声明抛出该异常(或其父类),要么用 try-catch 块捕获并处理该异常
2.callerMethod2() 选择捕获处理 (try-catch)。当然,你也可以选择捕获它们。b) 捕获处理(Catch): 在 caller() 方法内部,使用 try-catch 块将调用 test() 的代码包裹起来,并在这个 catch 块中处理该异常(例如记录日志、恢复状态、返回错误码、包装成运行时异常再抛出等)。调用者必须处理: 任何方法(我们叫它 caller())想要调用 test() 方法时,编译器会强制要求 caller() 必须对这个潜在的受检异常做出处理。
2025-06-25 13:01:16
316
原创 在Java I/O流中,flush()方法
即使是无缓冲的流(如 FileOutputStream),close() 方法仍然会执行刷新操作(虽然技术上是空操作),这是API设计的统一行为。在Java I/O流中,flush()方法是一个关键操作,用于确保数据被实际写入目标位置。必要性:I/O操作通常使用缓冲区提高性能,flush()确保数据不会卡在缓冲区。功能:强制将输出流缓冲区中的任何暂存数据立即写出到目标(文件/网络等)作用:自动调用 flush()(如果有缓冲数据)作用:强制将缓冲区中的任何数据立即写入目标。flush()方法的作用。
2025-06-22 10:23:12
582
原创 java正则表达式
重要提示:不能直接 new Pattern(),必须通过 compile() 方法创建。重要提示:通过 Pattern.matcher() 获取,不能直接创建。四、错误处理(PatternSyntaxException)作用:把字符串形式的正则表达式编译成计算机能高效使用的格式。1.Pattern 类 - 正则表达式"模具"2.Matcher 类 - 匹配"探测器"作用:在具体文本中查找匹配正则表达式的部分。五、完整工作流程示例(用户注册验证)二、Pattern 类详解。三、Matcher 类详解。
2025-06-08 15:43:18
253
原创 在Java中,所有参数的传递都是值传递(Pass by Value),包括对象引用
1.Java只有值传递:当传递对象时,传递的是引用的拷贝值(即对象内存地址的副本),而非原始引用本身。param = new MyObject(20) 使 param 指向新对象B(0x200)2.无法修改原始引用:方法内对引用变量重新赋值(指向新对象)不会影响调用方的原始引用。3.可以修改对象内容:通过引用拷贝访问原始对象并修改其内部状态,会影响原始对象。结果:obj1 指向的对象内容被修改(value=20)结果:obj1 仍指向 0x100(对象A不变)param 作为拷贝仍指向 0x100。
2025-06-08 10:10:33
268
原创 当子类与基类不在同一个包时,protected访问修饰符的行为有其特殊性
这个设计确保了面向对象编程的封装性,同时为子类提供了合理的访问权限。理解这个规则对构建健壮的Java应用程序至关重要。✅ 子类实例可以访问其他子类实例(兄弟)的 protected 方法。✅ 子类实例可以访问自身继承的 protected 方法。❌ 子类实例不能访问基类实例的 protected 方法。代码演示 - 跨包 protected 访问。包 com.animals (基类包)包 com.pets (子类包)
2025-06-01 20:42:34
173
空空如也
if大括号里或者其他什么情况下,分号可被逗号替代
2021-10-12
Java二维数组如何做形参,二维数组大小在主函数里定义,形参怎么写?
2021-09-29
c++的继承的属性是复制还是和父类共用
2021-06-16
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅