- 博客(108)
- 收藏
- 关注
原创 12.Java Map与Set深度解析:从二叉搜索树到哈希表的完整指南
左子树所有节点的值都小于根节点的值右子树所有节点的值都大于根节点的值左右子树也都是二叉搜索树5/ \3 7/ \ / \1 4 6 8核心思想:利用二分查找的思路组织数据,使得查找效率从O(n)提升到O(log n)。Map是一个接口,存储的是 键值对,Key唯一,Value可以重复。map.put("林冲", "豹子头");map.put("武松", "行者");Set是一个接口,继承自Collection,只存储Key,且Key唯一。
2026-07-20 17:29:10
108
原创 11.Java七大排序算法深度解析:从原理到代码,一篇就够了
排序是将一组数据按照特定规则(通常是升序或降序)重新排列的过程。看似简单,但不同的排序算法在不同的场景下性能差异巨大——有的适合小数据量,有的适合大数据量,有的稳定,有的不稳定。排序算法最好时间最坏时间平均时间空间复杂度稳定性冒泡排序O(n)O(n²)O(n²)O(1)✅ 稳定插入排序O(n)O(n²)O(n²)O(1)✅ 稳定选择排序O(n²)O(n²)O(n²)O(1)❌ 不稳定希尔排序O(n)O(n²)O(n^1.3)O(1)❌ 不稳定。
2026-07-20 17:26:42
206
原创 10.Java对象比较完全指南:从equals到Comparable与Comparator
对比维度equalsComparableComparator所属包java.langjava.util方法名返回值booleanint(负/零/正)int(负/零/正)比较能力只能判断相等可判断大小可判断大小侵入性中(覆写Object方法)强(修改类定义)弱(无需修改类)灵活性低低(一种规则)高(多种规则)适用场景判断对象是否相等自然排序定制排序基本类型直接用==比较对象比较equals:判断相等,不能比大小Comparable。
2026-07-18 22:21:48
198
原创 9.优先级队列与堆:从底层原理到实战应用的完整指南
Java中的底层使用的是堆这种数据结构。堆本质上是一棵完全二叉树堆的性质堆中某个节点的值总是不大于或不小于其父节点的值堆总是一棵完全二叉树根据第一条性质的不同,堆分为两种:类型条件特点小根堆(最小堆)父节点 ≤ 子节点根节点是最小值大根堆(最大堆)父节点 ≥ 子节点根节点是最大值知识点关键内容堆的定义完全二叉树 + 父节点与子节点的大小关系小根堆父节点 ≤ 子节点,根节点最小大根堆父节点 ≥ 子节点,根节点最大向下调整前提:左右子树已是堆,时间复杂度O(log n)
2026-07-18 22:18:25
406
原创 8.二叉树入门完全指南:从基础概念到实战应用
在我们正式进入二叉树之前,先聊聊更广义的树这个概念。树是一种非线性的数据结构,由n个有限节点组成具有层次关系的集合。之所以叫"树",是因为它看起来像一棵倒挂的树——根在上,叶在下。生活中的树形结构公司的组织架构:CEO下面有各部门总监,总监下面有经理,经理下面有员工电脑的文件系统:根目录下有文件夹,文件夹里又有子文件夹和文件家族族谱:祖辈繁衍出多个支系二叉树是每个节点最多只有两个子树的树结构。这两个子树分别称为左子树和右子树,且顺序不能颠倒。二叉树的核心特征每个节点最多有两个子节点(度 ≤ 2)
2026-07-17 08:37:05
369
原创 7.Java栈与队列:从生活场景到源码实现的完整解读
栈是一种只允许在固定一端进行插入和删除操作的线性表。这个固定端称为栈顶,另一端称为栈底。栈的核心规则是后进先出(LIFO,Last In First Out)——最后放入栈中的元素,最先被取出。生活中的例子一摞盘子:你总是先拿最上面的盘子(后放上去的)羽毛球筒:你从筒口拿到的总是最后一个放进去的球撤销操作(Ctrl+Z):最后一次操作被最先撤销队列是一种只允许在一端插入、在另一端删除的线性表。插入的一端称为队尾,删除的一端称为队头。队列的核心规则是。
2026-07-17 08:32:09
326
原创 6.Java LinkedList深度解析:从链表原理到源码实践
链表是一种物理存储结构上非连续的数据结构,数据元素之间的逻辑顺序通过指针(引用)链接起来。想象一下火车车厢:每节车厢里装着货物(数据),车厢之间通过挂钩(指针)相连。你可以轻松地在任意位置加挂或卸下车厢,而不需要移动其他车厢。// 节点存储的数据// 指向前一个节点的引用// 指向后一个节点的引用链表是非连续存储的数据结构,通过指针链接节点LinkedList底层是无头双向循环链表链表插入删除快(O(1)),但随机访问慢(O(n))选择ArrayList还是LinkedList,取决于你的。
2026-07-14 17:57:47
203
原创 5.深入理解Java ArrayList:从底层源码到实战应用
线性表和顺序表。线性表是n个具有相同特性的数据元素的有限序列。听起来有点抽象?其实生活中到处都是线性表:排队买奶茶的队伍(先进先出)手机的通讯录列表(可以上下滑动浏览)书架上一排整齐的书(每本书都有固定位置)线性表在逻辑结构上是连续的(像一条直线),但在物理存储上不一定连续。常见的线性表包括:顺序表、链表、栈、队列等。// 牌面值:1~13// 花色:♠♥♣♦@Override知识点核心要点底层结构动态数组(Object[])扩容机制无参首次扩容到10,后续1.5倍。
2026-07-14 17:53:26
217
原创 4.Java List接口全解析:从理论到实战,一篇就够了
List是有序、可重复的线性表,继承自Collection核心方法两种实现:ArrayList(数组,适合读多写少)和LinkedList(链表,适合写多读少)遍历方式:普通for、增强for、迭代器(各有适用场景)常见陷阱:remove的索引/对象混淆、subList的视图特性、并发修改异常。
2026-07-14 17:48:43
601
原创 3.Java核心进阶:包装类与泛型,从入门到源码级别理解
想象这样一个场景:你想写一个通用的"盒子"类,既可以装苹果,也可以装书本,还可以装手机。没有泛型之前,你只能用Object但这样做有两个问题:取出来时必须强制类型转换不小心放错了类型,运行时才会发现泛型就是为了解决这些问题而生——它把"类型"也变成了一个可以传递的参数。包装类让基本类型能够参与面向对象的编程,注意Integer的缓存机制泛型实现了类型参数化,让代码更加通用和安全类型擦除是Java泛型的实现机制,理解它有助于避开一些坑通配符提供了更灵活的类型匹配方式,遵循PECS原则。
2026-07-14 17:45:58
313
原创 16.Java常用工具类精讲:日期处理与精确运算
在Java编程的日常开发中,有两类需求几乎每个项目都会遇到:一是对日期和时间的各种操作,二是对数值进行精确计算。前者关系到日志记录、定时任务、数据统计等功能,后者则直接影响到金融交易、科学计算等对精度要求极高的场景。Java在这两方面都提供了丰富的工具类。早期的Date类虽然功能完备,但设计上存在不少瑕疵,很多方法已被标记为过时。好在Java 8引入了全新的日期时间API,彻底改变了我们处理日期的方式。而在数值计算方面,BigDecimal类则为高精度运算提供了可靠的保障。
2026-07-13 11:53:31
167
原创 15.Java异常处理:从束手无策到从容应对
相信每一位Java初学者都曾经历过这样的时刻:满怀信心地写完代码,点击运行,结果控制台突然冒出一片刺眼的红色错误信息。程序崩溃了,而你一脸茫然地看着那个陌生的异常类名,不知道发生了什么,更不知道该如何解决。异常,是编程路上绕不开的一道坎。但换个角度看,异常其实是程序在"说话"——它在告诉你:"我这里出问题了,快来帮帮我。今天这篇文章,我们就来系统地学习Java的异常处理机制。掌握了它,你就能听懂程序在说什么,并且知道该怎么回应。异常是指在程序执行过程中发生的一种特殊情况或错误状态。
2026-07-13 11:50:14
174
原创 14.Java String类深度解析:从源码到实战,一篇就够了
在Java编程中,String类可能是我们打交道最多的类之一。无论是接收用户输入、拼接日志信息,还是处理网络请求中的数据,字符串的身影无处不在。但你真的了解String吗?它为什么是不可变的?字符串比较到底该用==还是equals?频繁拼接字符串时为什么性能会急剧下降?和又有什么区别?带着这些问题,我们来一场String类的深度探索之旅。字符串常量池(StringTable)是JVM中一块专门用于存储字符串字面量的内存区域。它的核心作用是复用字符串对象,节省内存开销。
2026-07-13 11:43:45
222
原创 滑动窗口算法详解:从入门到精通(Java版)
滑动窗口是一种高效的算法技巧,专门用于处理连续子数组或子串的相关问题。它通过维护一个可变大小的窗口,在数组或字符串上滑动,从而避免重复计算,将时间复杂度从 O(n²) 优化到 O(n)。题目窗口特征判断条件结果更新时机长度最小的子数组窗口和≥target窗口和≥target时收缩每次满足条件时无重复字符的最长子串窗口内无重复字符出现重复时收缩每次调整后最大连续1的个数III窗口内0的个数≤k0的个数>k时收缩每次调整后将x减到0的最小操作数窗口和=target。
2026-07-13 11:35:43
285
原创 双指针算法详解:从入门到精通(Java版)
双指针是一种常用的算法技巧,通过使用两个指针在数组或链表等数据结构上进行移动,来解决特定问题。题目指针类型关键技巧移动零快慢指针数组分块,维护非零区间复写零前后指针从后向前避免覆盖快乐数快慢指针检测循环盛水容器对撞指针移动较短边界三角形个数对撞指针排序后固定最长边两数之和对撞指针利用有序性三数之和对撞指针固定一个数+去重四数之和对撞指针固定两个数+去重双指针的核心思想。
2026-07-13 11:28:39
234
原创 2.算法效率的核心密码:时间复杂度和空间复杂度详解
时间复杂度和空间复杂度是算法分析的基石,也是面试中绕不开的话题。理解它们不仅能帮你在面试中脱颖而出,更能让你在日常开发中写出更高效的代码。下一篇文章,我们将把这些知识应用到集合框架的源码分析中,看看ArrayList和LinkedList各自的性能特点是如何由它们的底层数据结构决定的。有任何疑问,欢迎在评论区交流探讨!注:本文为个人学习总结,文中示例均为独立编写。建议读者在学习过程中结合实际代码运行验证,加深理解。
2026-07-12 15:35:45
189
原创 1.Java集合框架入门指南:从零掌握核心数据结构
数据结构是计算机存储、组织数据的方式。简单来说,它就是解决“数据怎么放、怎么找”这个问题的一套方法论。算法是解决问题的计算步骤。比如你要从100万条数据中找到某个值:顺序查找:最多需要100万次比较二分查找(数据有序):最多只需20次比较这就是算法的魅力——用更好的策略解决问题。把自己学到的知识用自己的话写出来,是最好的巩固方式。即使写得不好也没关系,关键是养成总结的习惯。集合框架是Java学习的必经之路,也是区分“会用”和“懂原理”的分水岭。
2026-07-12 15:30:33
184
原创 Java13:Java抽象类与接口:从设计思想到实战应用
在前几篇文章中,我们学习了面向对象的三大特性:封装、继承和多态。你已经能够用继承来复用代码,用多态来让程序更灵活。但在实际开发中,我们会遇到一些更棘手的设计问题:某个父类的方法,在父类中根本无法给出有意义的实现,但又必须让子类去实现——比如图形的draw()方法,图形本身怎么画?一个类需要同时具备多种能力,但Java又不支持多继承——比如一只鸭子既要会飞、又要会跑、还要会游泳,怎么办?抽象类和接口。在Java中,使用abstract关键字修饰的类称为抽象类,使用abstract修饰的方法称为抽象方法。
2026-07-12 15:18:25
551
原创 Java12:Java多态详解:让代码更灵活,让设计更优雅
在前一篇文章中,我们学习了Java的继承机制。通过继承,子类可以复用父类的代码,并在其基础上扩展自己的功能。但继承的真正威力,需要结合多态才能完全发挥出来。多态是面向对象编程的三大特性之一(封装、继承、多态),也是Java中最具魅力的特性之一。它让同一个行为在不同的对象身上表现出不同的形态,极大地提升了代码的灵活性和可扩展性。今天这篇文章,我们就来深入理解Java中的多态机制。"多态"这个词的字面意思是"多种形态"。同一个消息,不同的对象接收到后会做出不同的响应。
2026-07-12 15:13:09
312
原创 Java11:Java继承详解:让代码复用的艺术更上一层楼
在前面的文章中,我们学习了面向对象的基础概念:类与对象、封装、static关键字等。你已经知道如何用类来描述现实世界中的事物,并通过封装来保护数据的安全。但现实世界是复杂的。猫和狗有很多相似之处——它们都有名字、年龄,都会吃东西、睡觉。如果按照之前的方式,我们需要在Dog类和Cat类中分别定义这些属性和方法,造成大量的重复代码。有没有一种方式,能把这些共性抽取出来,让猫和狗共享呢?这就是我们今天要学习的核心主题——继承。继承是面向对象程序设计中实现代码复用的重要手段。
2026-07-11 20:04:40
437
原创 Java10:Java面向对象进阶:包、封装、static与代码块深度解析
在上一篇文章中,我们学习了面向对象的基础概念:类与对象、构造方法、this关键字。你已经知道了如何定义一张"设计图"(类),并根据它建造出"房子"(对象)。但面向对象的魅力远不止于此。当程序规模逐渐扩大,我们会面临新的挑战:类越来越多,名字冲突怎么办?对象的内部数据如何保护,不让外部随意篡改?有些属性是所有对象共享的,该如何定义?对象创建时,初始化顺序是怎样的?今天这篇文章,就来一一解答这些问题。包封装static关键字和代码块。创建自己的包很简单,只需要在Java文件的第一行加上。
2026-07-11 19:59:38
398
原创 Java9:Java面向对象入门:从现实世界到代码世界的映射
在前面几篇文章中,我们学习了变量、运算符、流程控制、数组等基础知识。细心的读者可能已经发现,我们一直在用"面向过程"的方式写代码——程序就是一系列指令的集合,从上到下依次执行。这种方式对于小程序来说够用,但当代码规模变大时,问题就来了:代码难以维护、难以扩展、难以复用。Java是一门纯面向对象的语言。什么叫"面向对象"?简单来说,就是把现实世界中的事物直接映射到代码中——人就是人,车就是车,而不是一堆散乱的数据和函数。今天这篇文章,我们就来正式踏入Java面向对象编程的大门。
2026-07-06 16:47:34
144
原创 Java8:Java数组详解:从入门到精通,一文就够了
想象这样一个场景:期末考试结束了,老师让你录入班上50名同学的Java成绩。按照我们之前学过的知识,你会怎么做?score1score2score3……一直到score50。听起来就很离谱对吧?不仅代码冗长得吓人,而且如果要统计平均分、找最高分,你还得把这50个变量挨个操作一遍。更糟糕的是,如果班级人数增加到100人,难道还要再加50个变量?显然,我们需要一种更聪明的方式来管理同类型的数据。这就是今天的主角——数组。数组的概念:相同类型元素的连续集合创建和初始化:动态初始化 vs 静态初始化基本操作。
2026-07-06 08:33:56
362
原创 Java7:Java调试入门:用好IDEA调试器,Bug无处遁形
在学习Java的过程中,你一定遇到过这样的情况:代码编译通过了,但运行结果却和预期不一样。没有报错,没有异常,可结果就是不对。这种时候,很多初学者会选择在代码里到处加,试图通过打印信息来定位问题。这种方法虽然有效,但对于稍微复杂一点的程序来说,效率实在太低了——你得不断地改代码、重新编译、重新运行,来回折腾好几轮。今天这篇文章,我们来学习一种更专业、更高效的排错方式——调试(Debugging)。掌握了调试技能,你就能像医生做CT扫描一样,精准地看到程序在每一步执行时的状态,Bug自然无处藏身。调试。
2026-07-06 08:18:52
281
原创 Java6:Java方法详解:让代码告别重复,拥抱复用
经过前面几篇文章的学习,我们已经掌握了变量、运算符、流程控制和输入输出。但不知你有没有发现一个问题:当我们的程序越来越复杂时,代码变得越来越臃肿,同样的逻辑反复出现,修改一处就要改动多处。比如我们要计算1!、2!、3!……5!,如果不使用方法,就得把阶乘的逻辑重复写五遍。这不仅浪费时间,还容易出错。今天这篇文章,我们来学习Java中最重要的代码组织方式——方法。掌握了方法,你的代码将从"流水账"升级为"模块化"。修饰符 返回值类型 方法名称(参数类型 形参...) {方法体代码;
2026-07-06 08:06:32
226
原创 Java5:Java输入输出:让程序和世界对话
经过前面几篇文章的学习,我们已经掌握了Java的基本语法、数据类型、运算符和流程控制。数据都是写死在代码里的。变量赋值靠手写,条件判断靠预设——这样的程序就像一个自言自语的人,永远不知道外界发生了什么。今天这篇文章,我们来学习Java的输入输出。掌握了这部分内容,你的程序就能真正和用户"对话"了:既能向用户展示信息,也能接收用户的指令和数据。println:带换行的输出print:不带换行的输出printf:格式化输出,灵活控制显示格式nextInt()nextLine()输入类型不匹配时的处理方法。
2026-07-05 15:34:33
285
原创 Java4:Java程序逻辑控制:让代码学会思考和重复
经过前三篇文章的学习,我们已经掌握了Java的基本数据类型、变量和运算符。但到目前为止,我们写的程序都是"直线"执行的——从上到下,一行接一行,没有任何分支和转折。这就好比一台只会走直线的机器人,遇到岔路口不会拐弯,碰到重复劳动也不会偷懒。显然,真正的程序要比这灵活得多。今天这篇文章,我们来学习Java中的程序逻辑控制——让代码能够做出判断、选择路径、重复执行。这是编程从"玩具"走向"工具"的关键一步。顺序结构:代码按顺序逐行执行分支结构。
2026-07-05 15:26:46
413
原创 Java3:Java运算符详解:编程世界的加减乘除
在前两篇文章中,我们了解了Java的基本数据类型和变量。但光有数据还不够,我们还需要一套工具来操作这些数据——这就是运算符。运算符就像是编程世界里的"动词",告诉计算机要对数据做什么样的操作。今天的文章将系统地梳理Java中的各类运算符,并结合实际案例帮助你理解它们的用法和注意事项。学完这一篇,你将能写出真正"动起来"的Java代码。算术运算符关系运算符:==!逻辑运算符:&& ||!(支持短路求值)位运算符:& | ~ ^移位运算符:<< >> >>>条件运算符。
2026-07-05 15:16:50
174
原创 Java2:Java数据类型与变量:编程世界的基础法则
上一篇文章我们完成了第一个Java程序的编写,理解了Java程序的基本结构。今天,我们将深入探讨编程中最基础也最重要的概念——数据类型与变量。如果把编程比作盖房子,数据类型就是砖块和水泥的种类,变量则是存放建筑材料的仓库。掌握了它们,你就真正踏入了Java编程的大门。// 基本语法:数据类型 变量名 = 初始值;// 定义一个整型变量age,值为22// 定义一个浮点型变量heightchar gender = '男';// 定义一个字符型变量gender// 定义一个布尔型变量isStudent。
2026-07-05 15:10:47
468
原创 Java1:初识Java:从零开始的编程之旅
如果你正在寻找一门既强大又优雅的编程语言作为入门选择,Java绝对值得你认真考虑。作为全球最受欢迎的编程语言之一,Java不仅拥有清晰易懂的语法,还构建了一个完整的技术生态系统。今天,我们就从零开始,一起揭开Java的神秘面纱。Java之所以历经三十年依然充满活力,正是因为它兼具了简单与强大、安全与灵活、跨平台与高性能的多重特质。无论你是想从事后端开发、移动开发,还是大数据方向,Java都能为你打下坚实的基础。记住:编程之路没有捷径,但有好的起点。希望这篇文章能成为你Java旅程中一块坚实的垫脚石。
2026-07-05 15:05:06
235
原创 JavaEE必会面试题,从线程讲到线程安全,一文带你通过多线程面试
目录一、讲讲线程与进程的联系二、线程创建的五种写法三、产生线程安全问题的五大原因四、线程的状态有哪几种?五、死锁产生的四个必要条件[🌟背下来]六、如何避免死锁?七、请你写一个懒汉模式线程安全的代码并解释你这样写的原因🌟你的回答:
2026-06-26 17:10:04
189
原创 9.Java并发编程避坑指南:synchronized死锁、volatile内存可见性与wait/notify正确使用
9.Java并发编程避坑指南:synchronized死锁、volatile内存可见性与wai/notify正确使用
2026-06-06 15:39:06
328
原创 8.Java多线程之synchronized深度解析(含代码+死锁分析)
8.Java多线程之synchronized深度解析(含代码+死锁分析)_lcy
2026-06-05 23:43:49
483
原创 16.滑动窗口经典例题:最小覆盖子串(LeetCode 76)算法原理剖析
16.滑动窗口经典例题:最小覆盖子串(LeetCode 76)算法原理剖析
2026-06-05 15:08:51
352
原创 15.LeetCode 30. 串联所有单词的子串(Java):滑动窗口+哈希表详解
15.LeetCode 30. 串联所有单词的子串(Java):滑动窗口+哈希表详解
2026-06-04 19:51:13
372
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅