- 博客(54)
- 收藏
- 关注
原创 MySQL查询语句的执行流程
这篇文章主要从一条查询的sql语句入手,从发起查询,客户端与服务端建立起连接起手,深入到MySQL的存储引擎,为大家展现sql语句的一整套执行流程。
2025-06-16 16:14:41
744
原创 Java中的this关键字
Java中的this关键字是当前对象的隐式引用,主要有四种核心用法:区分成员变量与局部变量、构造方法中调用其他构造方法、作为参数传递当前对象、返回当前对象实现方法链。从底层看,JVM会将this作为实例方法的第一个隐含参数传递。this在内部类和匿名类中可用于访问外部类成员,与super配合实现继承逻辑。常见错误包括在静态方法使用this和构造器顺序错误。最佳实践包括用this增强可读性、构建流畅API,但需避免滥用。this不会带来性能开销,是Java面向对象编程的重要机制。
2025-06-14 10:42:43
646
原创 Java装箱与拆箱原理
装箱(将基本类型转为包装类)和拆箱(包装类转基本类型)是Java重要的语法糖机制。其中,编译器通过valueOf()和intValue()等方法实现转换;Integer等包装类对常用值(-128~127)进行缓存优化。在集合操作、方法参数传递等场景中需特别注意自动装箱,但性能敏感场景应优先使用基本类型以避免额外开销。常见陷阱包括空指针异常、比较误区(==与equals区别)和循环中的性能损耗。该机制的核心意义在于兼容泛型系统、支持null值表达,并实反射与框架的动态集成,同时通过缓存优化平衡性能。
2025-06-03 01:22:22
930
原创 Java类型转换
Java类型转换分为基本数据类型和引用类型转换。基本类型转换包括自动转换(小转大)和强制转换(大转小),可能导致精度丢失;引用类型包含向上转型(子转父,安全)和向下转型(父转子,需instanceof检查)。自动装箱拆箱简化了基本类型与包装类转换,但要注意性能影响和NullPointerException风险。最佳实践包括:避免不必要的强制转换、转换前检查类型、优先使用多态替代频繁转换。在框架应用中,Spring、JPA等工具提供了便捷的类型转换机制。正确使用类型转换能提升代码灵活性和安全性。
2025-06-03 00:51:08
742
原创 Java引用类型
本文系统介绍了Java引用类型,包括类、接口、数组等分类,以及与基本类型的区别。重点解析了四种引用类型:强引用(默认形式)、软引用(适合缓存)、弱引用(GC时回收)和虚引用(跟踪回收)。文章深入探讨了引用队列、WeakHashMap原理等高级应用,并提供了内存泄漏解决方案和性能优化建议。通过框架应用实例(如Spring缓存、Android内存优化)展示了引用类型的实际价值,帮助开发者根据场景选择合适的引用类型。
2025-06-02 23:15:47
613
原创 Java转义字符
文章系统介绍了Java中各类转义字符的用法,包括标准转义序列(如\n、\t)、Unicode转义(\u)以及特殊场景应用。重点讲解了字符串处理、正则表达式、文件路径中的常见陷阱与正确写法,并提供了ANSI颜色输出、SQL处理等高级应用示例。文章还强调了编译时处理机制、性能优化建议,推荐使用专用库处理HTML/XML/JSON等结构化数据。最后指出合理使用转义字符对代码质量、安全防护的重要价值,是Java开发者必须掌握的核心技能。
2025-06-02 20:26:31
871
原创 Java注释详解:单行、多行与文档注释的区别与应用
Java注释使用指南摘要:本文详细解析Java三种注释方式。单行注释(//)适合简短说明,多行注释(/.../)用于代码块说明,文档注释(/**...*/)专门生成API文档。文档注释支持@param、@return等标签,可通过javadoc工具生成HTML文档。最佳实践建议:public类和方法应使用文档注释,代码逻辑优先自解释,注释需及时更新。避免过度注释和嵌套多行注释。合理运用注释能提升代码可维护性,是团队协作的重要保障。
2025-06-02 16:27:33
996
原创 JVM内存模型(运行时数据区)
JVM内存模型是Java程序运行的核心,主要包括五大区域:堆内存存储对象实例,是所有线程共享且GC主要管理的区域;栈内存以栈帧形式保存方法调用的局部变量和操作数;程序计数器记录线程执行的字节码指令地址;方法区(元空间)存储类元数据和常量池等;本地方法栈则服务于JNI调用的本地方法。其中堆采用分代结构(年轻代/老年代),方法区在Java8后改为元空间使用本地内存。
2025-05-30 19:06:07
857
原创 Git的三种合并方式
Gitee(码云)分支合并方式对比:普通合并保留完整历史,适合团队协作;压缩合并将多个提交简化为一个,适合临时分支;变基合并提供线性历史但需本地操作,适合个人/开源项目。选择取决于是否需要保留历史记录、分支性质及协作需求,普通合并最安全,压缩合并最简洁,变基合并最清晰但风险较高。
2025-05-29 23:59:12
1066
原创 Nacos注册中心原理
本文详解了服务注册中心的核心技术流程:1)服务注册阶段通过POST请求将元数据存入注册中心;2)服务发现阶段采用长连接和轮询机制;3)心跳续约机制维护实例健康状态,包含5秒心跳间隔和15秒超时设置;4)负载均衡策略对比了轮询、随机、加权等6种算法,推荐加权轮询为默认方案。文章还对比了Consul、Eureka和Nacos的技术特性,并分析了服务宕机后注册中心与调用者的处理流程,包括30秒超时重新注册和状态广播机制。
2025-05-28 22:59:02
963
原创 贪心算法之跳跃游戏问题
本文介绍了LeetCode上的“跳跃游戏”问题,要求判断是否可以从数组的第一个位置跳到最后一个位置。解题思路采用贪心算法,通过维护一个当前能到达的最远位置(maxReach),遍历数组时不断更新该值。如果当前位置超过maxReach,则无法到达终点;如果maxReach覆盖了终点,则提前返回true。代码实现中,通过循环遍历数组,检查并更新maxReach,最终判断是否可达。
2025-05-22 04:21:57
468
原创 摩尔投票算法
本文介绍了LeetCode第169题“多数元素”的解决方案,重点讲解了摩尔投票算法(Boyer-Moore Voting Algorithm)。该算法通过“对抗抵消”的方式,遍历数组并维护一个候选元素及其计数器,最终找到出现次数超过数组长度一半的元素。
2025-05-22 03:24:06
323
原创 gitee错误处理总结
当Git提示本地分支落后于远程分支时,通常是因为远程仓库有新的提交,而本地分支未同步这些更新。Git默认禁止非快进式推送以防止覆盖远程更改。
2025-05-20 01:25:44
452
原创 Docker 网络
Docker 提供了多种网络模式,用于管理容器之间、容器与宿主机以及外部网络的通信。不同的网络模式适用于不同的场景,如开发、测试、生产环境等。
2025-05-18 20:23:27
1136
原创 DockerFile实战
本文将指导读者如何自定义Docker镜像并在Docker上运行。本文章首先介绍了Dockerfile的基础指令,如FROM、ENV、COPY、RUN、EXPOSE和ENTRYPOINT,并提供了生产环境的最佳实践和典型错误示例。接着,文章详细解析分步骤技术,包括基础镜像选择、环境配置增强、应用部署优化和启动脚本进阶。此外,文章还提供了构建与运行命令,以及生产环境的安全加固、多阶段构建和镜像扫描建议。最后,文章列举一些常见问题及其解决方案,帮助读者更好地理解和应用Docker技术。
2025-05-18 19:26:54
807
原创 深度探索Docker镜像标签管理
本文深入探讨了Docker镜像标签管理的认知误区及企业级实践。作者通过一个简单的报错案例,揭示了Docker标签机制与常见软件版本管理的不同,特别是latest标签不会自动指向最新版本。通过一系列实验,验证了Docker标签的底层逻辑,并提出了从手动打标签到CI/CD集成的不同解决方案。最终,本文总结了企业级最佳实践,包括标签策略矩阵、版本推进流程和安全防护措施,强调了显式声明原则和通过官方文档验证的重要性。
2025-05-18 01:39:03
1053
原创 Dockerfile学习指南
Dockerfile是构建Docker镜像的核心工具,通过文本文件定义镜像的基础环境、依赖安装、文件结构和运行时配置。其核心优势包括构建结果的可重复性、自动化操作和版本控制。Dockerfile的基础语法包括FROM、WORKDIR、COPY、RUN、EXPOSE和CMD等指令,支持分层构建和多阶段构建,以优化镜像体积和构建效率。最佳实践建议合并RUN指令、使用.dockerignore文件、固定基础镜像版本,并确保安全实践如使用非root用户和定期更新基础镜像。
2025-05-17 21:42:49
573
原创 Docker数据卷
目录一、数据卷的本质与价值二、数据卷的三大类型1. 主机挂载卷(Host Volume)2. 命名卷(Named Volume)3. 匿名卷(Anonymous Volume)三、数据卷操作全图解1. 创建与管理2. 容器挂载示例四、数据卷的进阶特性1. 只读卷(Read-only)2. 卷驱动扩展3. 数据卷容器(已淘汰)五、数据卷的典型应用场景六、数据卷的注意事项七、数据卷与绑定挂载的对比结语数据卷(Volume)是Docker容器实现持久化存储的核心解决方案,它解决了容器文件系统的关键限制:
2025-05-17 20:50:05
780
原创 Docker入门指南:镜像、容器与仓库的核心概念解析
Docker通过容器化技术解决了传统应用部署中环境不一致的问题,实现了“一次构建,处处运行”的目标。其核心概念包括镜像(Image)、容器(Container)和镜像仓库(Registry)。镜像是应用的标准化打包,容器是镜像的运行实例,而镜像仓库则是镜像的集中管理中心。Docker的工作流程包括开发、构建、测试和部署阶段,通过Dockerfile定义镜像并生成容器。Docker的优势在于环境一致性、资源占用低、启动速度快、隔离性强和可移植性高。
2025-05-17 16:37:14
648
1
原创 JVM内存模型
JVM(Java虚拟机)是Java语言跨平台运行的核心,它通过模拟计算机的指令集和内存管理机制,将Java字节码转换为不同操作系统的机器码,实现“一次编译,到处运行”。JVM不仅支持Java,还兼容Kotlin、Scala等语言,体现了其语言无关性。学习JVM有助于深入理解Java程序的运行机制、优化性能、排查问题、编写高效代码,并提升职业竞争力。JVM的体系结构包括类加载子系统、运行时数据区和执行引擎,分别负责加载类文件、管理内存和执行字节码。通过JVM,开发者可以确保程序在不同平台上的一致性和高效性。
2025-05-14 20:45:42
1244
原创 Spring Boot 配置文件敏感信息加密:Jasypt 实战
在SpringBoot项目中,敏感信息如数据库密码、APIKey等通常直接存储在配置文件中,存在代码泄露、运维风险和合规性要求等安全隐患。为解决这些问题,可以使用Jasypt(Java Simplified Encryption)对敏感信息进行加密,并在运行时自动解密。集成Jasypt的步骤包括添加Maven依赖、生成加密字符串、配置密钥和算法,并在启动文件中启用加密属性。为确保安全,密钥应通过环境变量或启动参数动态注入,避免直接写在配置文件中。
2025-05-12 22:05:23
1549
原创 Spring 循环依赖
Spring中的循环依赖问题是指两个或多个Bean相互依赖,形成闭环引用关系。Spring通过三级缓存机制(singletonObjects、earlySingletonObjects、singletonFactories)来解决单例Bean的循环依赖问题。不同注入方式对循环依赖的处理不同:字段注入和Setter注入可以正常处理,而构造器注入无法解决,会抛出BeanCurrentlyInCreationException。循环依赖的局限性包括仅适用于单例Bean、构造器注入不适用、AOP代理问题等。
2025-05-10 20:29:30
983
原创 浅说MyBatis-Plus 的 saveBatch 方法
MyBatis-Plus的saveBatch方法是实现高效批量数据插入的关键工具。通过分析其源码,我们发现saveBatch默认使用逐条插入的方式,类似于传统的for循环插入,性能较低。然而,通过启用MySQL的rewriteBatchedStatements参数,可以将多条INSERT语句合并为一条批量插入语句,从而显著提升性能。在示例中,插入10万条数据的耗时从约43秒优化到约12秒,性能提升显著。因此,合理配置数据库连接参数并结合saveBatch方法,能够有效提升批量数据插入的效率。
2025-05-10 02:47:14
863
原创 String、StringBuilder与StringBuffer的区别
在Java开发中,String、StringBuilder和StringBuffer是三种常用的字符串处理类,它们各有特点,适用于不同的场景。String是不可变的,每次修改都会创建新对象,适合用于字符串常量。StringBuilder是可变的,性能高,适合单线程环境下的字符串操作。StringBuffer也是可变的,但通过synchronized关键字保证了线程安全,适合多线程环境。
2025-05-09 18:15:34
606
原创 JVM 如何优化 31 * x 为 (x << 5) - x?
在Java的hashCode()计算中,31作为乘数被广泛使用,因其质数特性减少哈希冲突,且其二进制形式(11111)适合优化。JVM将31*x优化为(x<<5)-x,利用位运算提升效率。这种优化基于数学等价性,将乘法转换为移位和减法操作,后者在CPU上执行更快。JVM自动应用此优化,开发者无需手动改写代码即可获得性能提升。此外,JVM对类似形式的乘数(如3,7,15,63等)也采用相同优化策略,但31在哈希计算中平衡了性能和冲突率,成为最常用选择。
2025-05-09 17:42:53
497
原创 Java中==和equals()的区别
在Java中,==和equals()用于比较操作,但它们的用途和行为有本质区别。==用于基本数据类型的值比较和引用类型的内存地址比较,而equals()默认比较内存地址,但可重写以比较内容。重写equals()时必须同时重写hashCode(),以确保哈希集合(如HashMap、HashSet)的正确行为。
2025-05-09 17:36:08
753
原创 自定义SQL
但是,事与愿违,在真是的业务场景下(如背景处),有些处理条件很多,那么对应的xml文件的代码量也随之上去了。此时,我们想要在这个mapper里面有一个updateBalanceByWrapper()方法实现我们的需求(类名有点失误,上面的已经更改了,下图忽略)在此,只是一个简单的查询,如果加上名字,或者其他条件,语句将会更加复杂。这里,我们有一个这样的需求:更新id为1,2,4的用户的余额,扣减200。需求:将id在指定范围内的用户(例如1,2,4)的余额扣减指定的值。大数据量下的性能优化需求。
2025-05-07 00:42:23
422
原创 条件构造器实战
当我们进入到BaseMapper的源码里面,我们可以看到,里面已经封装了很多关于CRUD的操作方法。除了最基础的CRUD之外,它还提供了很多其他的更为复杂的条件查询。在上一篇文章中,我们讨论了为什么要有构造器,构造器的优势以及构造器和传统SQL的一些对比。一些基础的CRUD封装在了最顶层的Wapper里面,越往下,其实现的功能越复杂。细看之下,我么不难从终端发现,在条件构造器的强大能力之下,虽然我们没有写一条关于sql的查询语句,但是,底层已经帮我们实现好了。原数据库数据,Jack的余额是1600。
2025-05-06 21:12:34
237
原创 为什么需要MyBatis-Plus条件构造器?
在MyBatis和传统JDBC开发中,我们通常需要手动编写SQL语句,这种方式虽然灵活,但也带来了一系列问题。MyBatis-Plus条件构造器的出现正是为了解决这些问题,它通过面向对象的方式构建查询条件,为广大开发者带来了诸多便利。接下来,我将用以下几点来向你介绍。条件构造器的出现解决了传统SQL编写的三大核心问题:安全性可维护性和开发效率。自动预编译防御注入面向对象API提升可读性链式调用简化条件组合智能适配不同数据库。
2025-05-06 16:50:58
657
原创 Mybatis-Plus的常见注解
在快速入门的那一篇中,我们发现,在xml映射文件里面,我们没有写任何的关于数据库的操作语句,但是却实现了对数据库CRUD功能的实现,这是怎么做到的呢?这一段代码是怎么知道User对应的是哪一张表的呢?我们此处有一个@Data的注解打开我们自己的项目如果没有这个注解的时候,他会自动的将User首字母小写作为数据库表名进行查询,刚好,里面有一个叫user的表,那又是如何知道主键的呢?在这里,他的处理方法是找到表中字段为id的,那么他就默认这个就是主键。
2025-05-05 17:23:44
380
原创 MybatisPlus快速入门
小tips:我们可以看到<artifactId>mybatis-plus-boot-starter</artifactId>,他是以mybatis-plus开头的,说明会这个是一个第三方弄的,而不是官方,如果是官方的他可能会以spring-boot-…根据这个测试结果,我么可以得知,这个项目目前的功能是完整的,那么我们现在来完成接下来的操作,用mybatis-plus代替原来的mybatis。将原来的mybatis的依赖换成mybatis-plus的依赖。并且,将里面的CRUD方法全部删除。
2025-05-05 15:35:11
252
3
原创 关于java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have …
更改完配置文件之后刷新maven,等待更新完成。在 JDK 21 下可能报错。
2025-05-05 13:17:07
489
原创 @Entity和@Table
在 Spring Boot 开发中,JPA(Java Persistence API)作为 ORM(对象关系映射)的核心技术,能够极大简化数据库操作。结合 MySQL 数据库的使用,开发者可以快速实现数据持久化。复杂约束(如联合唯一键)建议通过数据库迁移工具(如 Flyway)管理,而非依赖 Hibernate 自动生成。,Hibernate 可根据实体类自动调整表结构,但需注意以下问题。),确保 Hibernate 生成兼容的 SQL。:根据实体类自动增减字段,但不会删除数据。
2025-05-02 17:51:08
560
原创 如何在idea上传项目到gitee
:检查 SSH 密钥是否配置(参考 Gitee SSH 配置指南)。在后面你就可以根据下面的提示一步步在idea的命令行进行操作。:因 Gitee 仓库未初始化文件,直接推送可能冲突, “使用 Readme 文件初始化”:确认 Gitee 账号密码正确。登录 Gitee,点击 。(建议与本地项目同名)
2025-05-02 01:26:09
1978
原创 关于GitHub上gs-rest-service项目的学习记录Day01
这是一个基于 Spring Boot 的 RESTful Web 服务示例项目,主要目的是展示如何创建一个简单的 REST API。@RestController: 表明这是一个 RESTful Web 服务的控制器,自动将返回值转换为 JSON。带参数接口:GET http://localhost:8080/greeting?@GetMapping("/greeting"): 将 HTTP GET 请求映射到特定的处理方法。基础接口:GET http://localhost:8080/greeting。
2025-05-02 00:56:39
565
原创 解析桶排序
最后按照桶的编号顺序(从0号桶开始)依次取出所有元素,合并成一个完整的有序数组。首先需要计算数组中的最小值和最大值,这是后续分桶的基础。例如数据范围0-99,每个桶容量为10,则需要10个桶(0-9,10-19,...,90-99)中,每个桶内的元素单独排序,最后按顺序合并所有桶中的元素,得到完整的有序序列。:对每个桶内的元素进行排序(可以使用其他排序算法,如插入排序)。:根据某种规则(如数值范围)将元素分配到不同的桶中。:将所有桶中的元素按顺序合并,得到最终排序结果。
2025-04-11 19:41:22
1115
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人