- 博客(43)
- 收藏
- 关注
原创 Java集合框架总结(面试八股)
Java集合框架主要包括Collection和Map两大体系。Collection分为List(有序可重复)、Set(无序不可重复)和Queue(队列),常见实现类有ArrayList、LinkedList、HashSet等。Map存储键值对,主要实现包括HashMap、TreeMap等。不同集合类在线程安全、存储结构、性能特点等方面存在差异:ArrayList随机访问快,LinkedList插入删除快;HashSet查询快,TreeSet有序;HashMap查询快,TreeMap有序。线程安全方面,Vec
2025-12-28 10:22:19
657
原创 深入理解Java中的128陷阱与equals方法使用指南
比较基本类型:用==,直接比较值,没有任何问题。比较包装类型(Integer、Short等):优先用equals方法,避免128陷阱导致的判断错误;更推荐用Objects.equals工具类,防止空指针异常。避免用new关键字创建包装类型对象:除了会创建新对象(浪费内存),还会绕过缓存机制,增加踩坑风险。尽量使用自动装箱(Integer a = 127)或Integer.valueOf()方法。注意不同包装类型的equals比较。
2025-12-27 09:27:46
368
原创 Java面试题(SSM篇)
它与全自动的区别在哪里?1.59 AOP 作用是什么,底层如何实现在哪些地方会用到,分别简述切面,切入点和通知?1.60 Spring 中 AutoWired 和 Resource 之间区别是什么?它们之间的区别是什么?1.54 什么是基于 Java 的 Spring 注解配置?1.58 在 Spring AOP 中,连接点和切入点的区别是什么?1.50 MyBatis (IBatis) 的好处是什么?1.44 介绍一下 Spring 的事物管理?1.53 什么是 bean 的自动装配?
2025-12-21 09:10:42
221
原创 Java面试题(SSM篇)
1.39 Mybatis 映射文件中,如果 A 标签通过 include 引用了 B 标签的内容,请问,B 标签能否定义在 A 标签的后面,还是说必须定义在 A 标签的前面?1.30 JDBC 编程有哪些不足之处,MyBatis 是如何解决这些问题的?1.40 MyBatis 里面的动态 Sql 是怎么设定的?1.34 简述 Mybatis 的插件运行原理,以及如何编写一个插件?1.25 mybatis 的缓存机制,一级,二级介绍一下?1.28 什么是 MyBatis 的接口绑定,有什么好处?
2025-12-21 09:09:02
221
原创 Java面试题(SSM篇)
本文总结了Spring框架的核心概念与应用要点:1)Spring容器机制,包括IOC控制反转思想与DI依赖注入实现;2)Bean生命周期管理,涵盖作用域配置及延迟加载;3)SpringMVC处理流程与事务管理方式对比;4)MyBatis中#与$的区别及动态SQL应用;5)Shiro认证授权流程;6)Spring设计模式与并发安全策略。全文系统梳理了Spring技术体系的关键知识点,涉及容器管理、Web开发、数据访问及安全控制等核心模块。
2025-12-21 09:05:52
434
原创 Windows上完成SSH密钥的添加
本文介绍了SSH密钥的基本概念与配置流程。私钥和公钥是一对加密密钥,私钥用于签名和解密,必须保密;公钥可公开用于验证和加密。文章详细说明了生成SSH密钥对的步骤:通过ssh-keygen命令创建RSA密钥,启动SSH代理并添加私钥,最后将公钥配置到Git平台(如Gitee或GitHub)。完成这些步骤后,用户即可通过SSH协议安全地访问远程仓库,实现代码的拉取和推送操作。整个过程确保了代码传输的安全性,是开发者必备的Git配置技能。
2025-12-11 15:31:32
979
原创 『Git Tag标签+项目远程操作全解:推送、拉取与版本同步实战』
本文介绍了Git标签(Tag)的创建、推送、拉取和删除等操作。主要内容包括:1)使用git tag命令创建轻量级和带附注的标签;2)通过git push origin --tags推送所有标签到远程仓库;3)使用git pull拉取远程标签;4)删除本地和远程标签的方法;5)标签检出的操作步骤。同时还介绍了远程仓库连接建立、分支推送与拉取协作等Git基础操作,帮助开发者实现项目版本的精准标记与团队同步。
2025-12-09 16:07:44
935
原创 《Git分支实战:从创建到合并的全流程》
本文系统介绍了Git分支的核心操作与应用场景。主要内容包括:1)分支基础操作(创建/切换/删除);2)分支合并与冲突解决;3)stash功能详解(apply与pop的区别);4)典型分支模型(master/develop/feature/release等)。重点讲解了如何通过分支管理并行开发、紧急修复等实际场景,以及处理代码冲突的具体方法。掌握这些分支技巧能有效提升团队协作效率,解决开发过程中常见的版本控制难题。文章还特别说明了stash功能在临时保存工作内容时的灵活应用方式。
2025-12-09 13:51:51
970
原创 《Git 日常操作:核心命令 + 忽略文件 + 临时存储》
本文介绍了Git日常开发中的核心操作:1. 基本命令流程:git init初始化仓库,git add将修改加入暂存区,git commit提交到本地仓库,git status查看状态,git log查看提交记录,git reset进行版本切换。2. .gitignore配置:详细说明如何创建和使用.gitignore文件来过滤不需要版本控制的文件,包括日志、缓存等,并提供了Java开发的通用模板。3. git stash应用:讲解如何临时保存未完成的修改,包括stash、apply和pop的区别,以及如何管
2025-11-30 19:31:19
881
原创 《Git 入门:从概念到环境准备》
《Git入门指南:从版本控制到高效协作》 摘要: 本文系统介绍Git的核心概念与应用。首先对比集中式与分布式版本控制系统,突出Git的分布式优势:每个开发者拥有完整代码库镜像,实现高效离线操作。其次详解Git仓库结构,包括远程/本地仓库、工作区、暂存区和版本库的关系。最后讲解多级配置体系(系统/用户/仓库级)及基础配置方法。作为系列文章首篇,后续将深入Git工作流、分支管理等进阶内容,帮助开发者掌握这个强大的版本控制工具,告别代码管理混乱,提升团队协作效率。
2025-11-30 19:12:16
873
原创 【MyBatis 从入门到实战下】超详细教程(含核心配置 + CRUD + 高级特性)
本文介绍了MyBatis框架中的关键特性与应用:1.特殊SQL执行包括模糊查询(三种实现方式)、批量删除和动态表名设置;2.自定义映射resultMap处理字段名与属性名不一致问题,并详细说明多对一(association)和一对多(collection)关系的映射处理;3.动态SQL技术(if/where/trim/choose/foreach等标签)实现条件查询;4.MyBatis缓存机制(一级缓存SqlSession级别,二级缓存SqlSessionFactory级别)及与Ehcache整合;
2025-11-27 16:17:56
871
原创 【MyBatis 从入门到实战上】超详细教程(含核心配置 + CRUD + 高级特性)
MyBatis是一款优秀的半自动ORM框架,由iBatis演变而来。文章详细介绍了MyBatis的环境搭建、核心配置、CRUD操作和参数传递方式。MyBatis通过XML或注解配置SQL映射,避免了JDBC硬编码,支持定制化SQL和高级映射。相比Hibernate,MyBatis更加轻量级且性能出色。文章还讲解了MyBatis获取参数的两种方式(#{}和${}),以及各种查询功能实现,包括单对象查询、集合查询和Map结果映射。最后预告了进阶内容,如动态SQL、缓存等高级特性。
2025-11-27 15:47:58
965
原创 Maven 项目管理从入门到进阶:基础与高级实战全解析
Maven核心知识点摘要:Maven是基于POM模型的项目管理工具,通过坐标(GAV)定位依赖资源。核心概念包括本地/远程仓库体系、依赖管理(传递/排除/范围)、构建生命周期与插件机制。高级特性涵盖聚合多模块构建、继承复用配置、自定义属性及私服部署(Nexus)。关键要点:1)依赖冲突遵循路径优先原则;2)父子工程通过dependencyManagement统一版本;3)私服实现资源内部分享与版权管控。掌握基础配置、常用命令和POM编写即可满足日常开发需求,遵循"约定优于配置"原则简化项
2025-11-22 17:12:41
671
原创 JavaWeb 文件上传全方案解析:从传统组件到现代框架实现
本文全面介绍JavaWeb开发中的文件上传实现方式,包括传统CommonsFileUpload组件、Servlet3.0原生上传、SpringMVC上传以及SpringBoot本地/云存储上传。详细讲解每种方式的环境配置、核心API和代码实现,并提供完整示例代码。对比分析各方案的优缺点及适用场景,如老旧项目适用CommonsFileUpload,企业级项目推荐SpringBoot+云存储。同时总结常见问题解决方案,如中文乱码、文件覆盖等。通过本文可系统掌握JavaWeb文件上传技术,满足不同开发场景需求。
2025-11-21 21:48:31
1117
原创 ssm框架之Spring(下)
AOP,Aspect Oriented Programming,面向切面编程,是对面向对象编程OOP的升华。OOP是纵向对一个事物的抽象,一个对象包括静态的属性信息,包括动态的方法信息等。而AOP是横向的对不同事物的抽象,属性与属性,方法与方法,对象与对象都可以组成一个切面,而用这种思维去设计编程的方式叫做面向切面编程。
2025-11-02 16:44:15
606
原创 ssm框架之Spring(上)
以上在xml配置的Bean都是自己定义的,例如UserDaoImpl。但是在实际开发中有些功能类并不是我们自己定义的,而是使用的第三方jar包中的,那么,这些Bean要想让Spring进行管理,也需要对其进行配置。配置非自定义的Bean需要考虑如下两个问题:1,被配置的Bean的实例化方式是什么?无参构造,有参构造,静态工厂还是实例工厂方式;2,被配置的Bean是否需要注入必要属性。1,加载xml配置文件,解析获取配置中的每个的信息,封装成一个个的BeanDefinition对象;
2025-11-02 16:27:52
812
1
原创 LeetCode 面试经典 150 题之判断子序列解题详解
LeetCode经典题目"判断子序列"采用双指针法高效解决。通过同步遍历字符串s和t,当字符匹配时移动双指针,否则仅移动t指针,时间复杂度O(m+n),空间复杂度O(1)。文章详细解析了算法思路、代码实现(Python/Java)和复杂度分析,并延伸讨论了多组查询时的预处理优化方案。该题考察基础算法能力,掌握双指针思想可迁移解决类似字符串问题。
2025-09-25 10:12:18
713
原创 基于完全分布式模式部署Hadoop(喂饭教程)
这篇文章我们来学习一下如何基于完全分布式模式来部署Hadoop,在安装Hadoop之前,我们先说明需要准备的东西。2,Centos9Stream镜像3,JDK安装包4,Hadoop安装包以上所需我们可以看出,我们将基于Centos9Sream来部署Hadoop,废话不多说,我们现在就开始了,大家可以完全跟着我一起安装。
2025-09-25 09:52:25
923
8
原创 LeetCode 面试经典 150 题之验证回文串:双指针解题思路详解
LeetCode经典题目"验证回文串"通过双指针法实现高效判断。核心思路是:从字符串两端向中间移动指针,跳过非字母数字字符,对称比较字符(忽略大小写)。时间复杂度O(n),空间复杂度O(1)。该题训练了对称匹配问题的解决能力,特别强调边界条件的处理技巧。典型示例如"A man, a plan"和"raceacar"分别演示了回文与非回文场景。掌握这一方法可拓展到其他对称校验问题。
2025-09-19 16:05:32
686
原创 LeetCode 面试经典 150 题之最长公共前缀:基准比较法高效解题
LeetCode 14题"最长公共前缀"要求查找字符串数组中的最长公共前缀。解题核心思路是以第一个字符串为基准,逐字符与其他字符串对应位比较,直至出现不匹配或字符串长度不足时停止。该算法时间复杂度为O(n×m),空间复杂度O(1)。关键点在于正确处理边界条件(空数组、单字符串、长度差异)和基准选择。通过这道题可以锻炼字符串处理、边界条件判断等基础编程能力,是面试中检验基础功的常见题目。
2025-09-19 15:26:30
1213
原创 LeetCode 面试经典 150 题之最后一个单词的长度:逆向遍历高效解法
本文解析了LeetCode经典面试题"最后一个单词的长度"的解题思路。该题考察字符串边界条件处理能力,建议采用逆向遍历法:先定位最后一个非空格字符(right),再向前找到单词起始位置(left),两者差即为长度。相比正向遍历可减少不必要的操作,时间复杂度O(n),空间复杂度O(1)。文章通过示例演示了关键步骤,并提供Python/Java代码实现,强调在处理"全空格字符串"等边界情况时的注意事项,体现了逆向思维在字符串处理问题中的优势。
2025-09-12 14:52:39
1291
原创 Java Servlet 完全解析:构建高效 Web 应用的关键技术
本文系统介绍了JavaWeb开发中的核心组件Servlet技术。从Servlet的基本概念出发,详细解析了其核心作用、与普通Java类的区别,以及运行依赖的核心组件和容器环境。重点阐述了Servlet的生命周期管理机制,包括初始化、服务、销毁和垃圾回收四个阶段。同时对比了Servlet的两种配置方式(XML与注解),分析各自的优缺点及适用场景。通过本文,开发者可以深入理解Servlet的运行原理和开发流程,为构建动态Web应用和后续学习高级框架奠定坚实基础。
2025-09-12 14:32:40
1631
原创 LeetCode 面试经典 150 题之罗马数字转整数:哈希表高效解题思路
本文解析了LeetCode经典面试题"罗马数字转整数"的解题思路。题目要求将罗马数字字符串转换为整数,关键在于处理特殊规则(如IV表示4)。核心解法是:1)使用哈希表存储罗马字符与数值的映射;2)遍历字符串,比较当前字符与右侧字符值的大小关系,决定加减操作。该方法时间复杂度O(n),空间复杂度O(1)。文章提供了Python和Java的代码实现,并建议通过这道题培养"将规则转化为算法逻辑"的能力,掌握哈希表在键值映射场景中的应用价值。
2025-09-11 11:49:31
744
原创 LeetCode 面试经典 150 题之买卖股票的最佳时机:高效解题思路解析
摘要:LeetCode经典题目“买卖股票的最佳时机”考察数组遍历和动态维护关键值的能力。解题核心是枚举每个卖出价,动态维护之前的最低买入价,计算最大利润。算法只需一次遍历,时间复杂度O(n),空间复杂度O(1)。Python和Java实现简洁高效,适用于面试场景。该题解法可扩展至股票买卖系列的其他变种问题,掌握其核心思想对解决类似题目大有裨益。
2025-09-11 09:11:52
913
原创 LeetCode 面试经典 150 题:轮转数组(三次翻转法详解 + 多解法对比)
摘要: 轮转数组是考察原地操作与逻辑转换的经典算法题。最优解三次翻转法通过三次数组翻转(整体、前k个、后n-k个元素)实现O(n)时间复杂度和O(1)空间复杂度的原地轮转。关键步骤包括:对k取模避免冗余操作,翻转调整元素顺序。对比额外数组法(O(n)空间)和多次右移法(O(nk)时间),三次翻转法效率最优。代码实现需注意边界条件,逻辑可扩展至向左轮转等变体问题,体现算法灵活性。掌握此方法有助于解决类似元素循环移动问题。
2025-09-09 19:31:55
786
原创 LeetCode 面试经典 150 题:多数元素(摩尔投票法详解 + 多解法对比)
摩尔投票法是解决 “多数元素” 问题的最优解,其核心优势在于 “线性时间 + 常数空间”,这种高效性使其在面试中备受青睐。数组中存在多数元素(若不确定是否存在,需在第一次遍历后进行二次遍历,统计候选元素的出现次数,确认是否满足 “多数” 条件);多数元素的定义是 “出现次数大于⌊n/2⌋”(若定义为 “出现次数大于⌊n/3⌋”,则需扩展为 “双候选人摩尔投票法”,可找出最多两个候选元素,再二次验证)。
2025-09-09 19:14:23
1038
原创 LeetCode 面试经典 150 题:删除有序数组中的重复项 II(最多保留 2 次 + 通用 k 次解法详解)
本文介绍了如何解决有序数组中保留最多k次重复元素的问题。解题核心在于利用双指针思想,通过判断当前元素与已处理数组倒数第k个元素的关系来控制重复次数。基础解法(保留2次)通过比较当前元素与nums[k-2]实现,通用解法(保留k次)只需调整判断条件即可。时间复杂度为O(n),空间复杂度为O(1)。文章提供了Python和Java代码示例,并指出该思路可扩展解决类似变形问题,如保留3次或只保留不重复元素等。掌握这种通用化方法能有效应对面试中的数组去重问题。
2025-09-08 16:46:00
1027
原创 LeetCode 面试经典 150 题:删除有序数组中的重复项(双指针思想解法详解)
本文详细解析LeetCode第26题"删除有序数组中的重复项"的解法。题目要求原地删除重复元素,保持元素顺序,返回新长度。核心思路是利用数组有序性,通过双指针(变量k)维护无重复区域:快指针遍历数组,慢指针记录无重复元素位置。时间复杂度O(n),空间复杂度O(1)。文章提供Python和Java代码实现,并指出该解法是双指针思想的简化应用,可拓展解决类似问题(如删除重复项II、移除元素等),帮助读者掌握有序数组筛选的核心技巧。
2025-09-08 16:26:38
984
原创 LeetCode 面试经典 150 题:移除元素(双指针思想优化解法详解)
这道题的核心是 “用变量 k 追踪有效元素的位置和个数”,本质是双指针思想的简化 —— 如果把k看作 “慢指针”,遍历数组的索引(或元素)看作 “快指针”,就是典型的 “快慢双指针” 解法:快指针负责遍历数组筛选元素,慢指针负责存放有效元素。
2025-09-07 14:18:19
1071
原创 LeetCode 面试经典 150 题:合并两个有序数组(双指针解法详解)
本文解析了LeetCode 88题"合并有序数组"的最优解法——双指针法。该算法通过从后向前遍历,比较nums1和nums2末尾元素,将较大值放入nums1末尾,避免了元素覆盖问题。时间复杂度为O(m+n),空间复杂度O(1)。文章详细讲解了指针初始化、遍历逻辑和终止条件,并提供了Python和Java代码实现。这种双指针技巧也适用于其他数组操作问题,如移除元素、两数之和等。掌握该方法能有效提升算法面试中的解题能力。
2025-09-07 14:09:58
637
原创 深入理解 Java 中的 Lambda 表达式:简化代码的利器
Lambda 表达式作为 Java 8 的核心特性之一,为 Java 编程带来了革命性的变化。它通过简洁的语法,将函数作为参数传递,极大地简化了代码编写,提升了代码的可读性和可维护性。在实际开发中,Lambda 表达式广泛应用于线程创建、集合排序、Stream API 等场景,与函数式接口紧密配合,成为现代 Java 开发不可或缺的工具。然而,在使用 Lambda 表达式时,我们也需要注意其适用范围(仅函数式接口)、避免过度使用以及变量捕获的限制等问题。
2025-09-06 10:33:57
1256
原创 Java 注解:不止 @Override,这篇讲透
Java注解(Annotation)是JDK5.0引入的语法元素,用于为代码提供元数据。它具有无直接执行性、可被工具识别和可自定义的特点。注解通过@interface关键字定义,可包含属性,并能通过元注解(@Target、@Retention等)指定作用范围和生命周期。Java内置了@Override、@Deprecated、@SuppressWarnings等常用注解。注解的实际应用需要通过反射机制解析,典型应用包括框架开发中的自动配置和日志记录等。通过注解可以简化代码、提高开发效率和增强代码可读性,是现
2025-09-06 10:23:39
1251
原创 Java 代理模式:从 “重复代码” 到 “优雅解耦”,这篇讲透静态与动态的核心差异
/ 业务接口:定义用户服务的核心行为// 新增用户// 删除用户// 附加功能处理器:统一处理日志逻辑// 持有目标对象(通用类型,可接收任何目标类)/*** 代理类的核心方法:每次调用代理对象的方法,都会触发invoke* @param proxy 代理对象本身(一般不用)* @param method 被调用的目标方法* @param args 目标方法的参数* @return 目标方法的返回值* @throws Throwable 目标方法可能抛出的异常*/
2025-08-30 09:48:22
951
原创 Java泛型:告别Object强转,拥抱类型安全的优雅编程!
还记得面对一箱子Object,每次取出都要心惊胆战地做类型强转的日子吗?一个不小心,就会在运行时给你当头一棒!Java泛型,正是为了解决这种“类型不安全”的痛点而生。它如同给容器和算法戴上了一副智能眼镜,让它们在编译期就能清晰地识别和约束操作的数据类型。今天,让我们一起推开泛型的大门,探索如何用它编写更健壮、更易读、更优雅的Java代码!定义类,接口,方法时,同时声明一个或者多个类型变量(如:),称为泛型类,泛型接口,泛型方法,他们统称为泛型。
2025-08-29 17:06:34
434
原创 驾驭程序的“意外”:深入理解Java异常处理
1,定义一个异常类继承RuntimeException2,重写构造器3,通过throw new 异常类(xxx)来创建异常对象并抛出。save(20);save(160);// 运行结果20以上就是今天异常中的所有内容。在Java的世界里,异常处理不仅是代码的“安全网”,更是我们构建健壮、可维护应用的基石。通过合理使用try-catch块、自定义异常和throws声明,我们不仅能捕获潜在错误,还能提升程序的容错性和用户体验。
2025-08-29 15:36:45
1068
原创 JavaSE阶段 (一)
计算机语言是人与计算机之间的通讯语言,分为机器语言、汇编语言、高级语言。Java是一种高级计算机语言,它是由Sun公司(已被Oracle公司收购)于1995年5月推出。
2025-08-06 12:11:12
714
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅