- 博客(132)
- 收藏
- 关注
原创 数组、特殊矩阵、稀疏矩阵
如果矩阵中非零元素数量远小于总元素数量,称为稀疏矩阵。一般约定:非零元素占比 < 5% 就可以认为是稀疏矩阵。❌ 问题:直接开二维数组存储,大量 0 白白浪费空间。三元组顺序表,只保存非 0 元素。表格存储方式适用对象优点缺点二维数组稠密矩阵随机访问 O (1)0 元素浪费大量空间特殊矩阵压缩(公式映射)对称 / 三角 / 对角矩阵空间小、可以公式寻址只适合有规律矩阵三元组顺序表静态稀疏矩阵节省空间,实现简单随机访问失效,增删慢十字链表动态稀疏矩阵(频繁修改)
2026-11-06 17:13:49
84
原创 Map 接口 & HashMap & LinkedHashMap & TreeMap
称之为键值对(Entry)key 唯一,不能重复;value 可以重复一个 key 只能对应一个 value;如果 put 相同 key,后面的值会覆盖前面的值key 和 value 都可以是 null,但是HashMap 最多只能有一个 key 为 null,value 可以多个 nullMap 集合没有继承 Collection 接口,是独立的双列集合,遍历方式和 Collection 单列集合不一样//学生类,作为key,必须重写hashCode、equals。
2026-11-05 00:03:40
201
原创 KMP算法
next[0]=-1(严版)和next[0]=0,写代码、看题目一定要对齐!❌ KMP 匹配的时候,手动让 i 回退,这是 BF 的逻辑,KMP 禁止 i 回退❌ 求 next 数组循环条件写错,j<m-1不是j<m❌ 混淆 “最长相等前后缀”,前后缀不能包含整个字符串j == m,不是 i。
2026-11-04 23:52:29
182
原创 朴素模式匹配(BF 算法,Brute Force 暴力匹配)
补充说明:很多教材下标从 1 开始写 BF,代码里 i、j 初始化为 1,逻辑会有一点点区别,考试要看题目定义!适合短字符串匹配、文本量很小的场景;长文本、大数据搜索(搜索引擎)一般不用 BF,改用 KMP、BM、Sunday 等算法。对比:后面 KMP 就是为了消除主串的回退,把复杂度降到 O(m+n),BF 是 KMP 的前置基础。✅ 优点:逻辑最简单、好理解、好写代码 ❌ 缺点:存在大量重复回溯,最坏时间复杂度很高。,初学者优先掌握 0 下标版本,和 C 语言字符串一致。
2026-11-04 23:49:04
285
原创 Set接口、HashSet、LinkedHashSet
成员变量private 私有,保护数据安全提供无参、有参构造方法根据业务需要编写 get、set 方法,不需要就不写,不是必须全部生成重写toString():打印对象时输出属性内容,否则打印类名@内存地址如果需要 HashSet 按业务属性去重:必须重写hashCode()和equals()//实体类,对应现实业务实体,未来可以映射数据库表//无参构造//有参构造//get、set//重写toString:输出对象时展示属性,而不是内存地址@Override。
2026-11-03 09:17:53
145
原创 TreeSet
TreeSet 属于 Set 接口实现类,;和 HashSet、LinkedHashSet 去重机制完全不一样,,依靠比较规则判定重复。两种排序方案:自然排序(Comparable)、比较器排序(Comparator)
2026-11-03 09:17:41
318
原创 集合概述 & Collection 接口
集合是 Java 提供的容器,用来存储、管理多个对象,长度可变。数组也是容器,集合就是为了弥补数组的短板。虚线 = 接口,实线 = 实现类;Collection、List、Set、Map 都是接口,不能直接 new有序、带索引、元素可重复;无序、无索引、元素不可重复:Collection 层面是按元素对象删除,不是索引;只有 List 才有按索引删除的重载方法clear()只是清空里面元素,集合对象本身还存在,不是变成 null集合存储的是对象地址,不是对象本身;
2026-11-03 09:17:24
150
原创 Iterator 迭代器、ListIterator & foreach 循环
foreach 是简化版 for 循环,底层依然是 Iterator 迭代器(语法糖)适用范围:数组、所有实现Iterablefor(容器中元素类型 临时变量 : 容器变量) {执行语句hasNext()只判断,不移动指针;不能连续多次调用next(),容易泛型缺失时,Iterator 取出元素是 Object,需要强制转换只能 List 获取,Set 集合不能使用增强 for 只是语法糖,编译后依然变成 Iterator,同样不能在遍历时直接调用集合增删方法。
2026-11-02 22:11:43
320
原创 LinkedList知识
LinkedList是List 接口的实现类,同时实现了Deque有序、可重复、带索引双向链表prev前驱指针 + item数据 + next后继指针✅ 核心特点首尾增删速度快:只修改指针,不需要移动元素查询慢:没有数组随机访问,按索引查找需要遍历链表线程不安全,支持存储 null兼具 List、队列、栈的功能,所以有两套首尾 API(一组抛异常,一组返回 null)ArrayList:可变数组 → 查询快,中间增删慢LinkedList:双向链表 → 首尾增删快,查询慢多态写时,
2026-11-02 22:11:27
83
原创 List 接口 & ArrayList
List 是Collection 的子接口(单列集合)有序:存入顺序和取出顺序一致可重复:允许存储重复元素有索引:支持根据索引操作元素(这是 List 独有的!Set 没有索引)所以 Collection 里所有方法,List 全都可以用,同时 List 新增一套带索引的专属方法ArrayList 是实现类,实现了 List 接口有序、可重复、有索引底层数组,查询快、中间增删慢扩容 1.5 倍;空参构造不会立刻创建长度 10 数组,JDK8 是懒加载线程不安全,不同步。
2026-11-02 22:11:09
316
原创 正则表达式
符号等价说明\d[0-9]任意数字\D[^0-9]任意非数字\s[\t\n\r ]空白字符:空格、制表符、换行\S[^\s]非空白字符\w单词字符(字母、数字、下划线)\W[^\w]非单词字符\A字符串起始,不受多行模式影响\G上一次匹配结束位置⚠️Java 重点:字符串中反斜杠需要转义!正则里 1 个,代码写\\例:正则\d→ Java 代码写成\\dmatches是全串匹配,不是包含匹配;只要有多余字符直接 false在正则代表任意字符;想匹配小数点,必须写\\.
2026-10-30 16:26:36
257
原创 SimpleDateFormat 、DateTimeFormatter
承接上一节 Date、LocalDate 系列,两个格式化器放在一起对比记忆。
2026-10-30 16:26:18
3
原创 Date、LocalDate、LocalTime、LocalDateTime、DateTimeFormatter类
JDK1.0 诞生,大部分方法过时,开发只记住两个常用构造底层本质:保存一个毫秒值,代表距离1970 年 1 月 1 日 00:00:00 UTC的毫秒数类包是否可变线程安全使用场景Datejava.util✅可变❌不安全老项目维护,不推荐新项目java.time❌不可变✅安全新项目首选❌不可变✅安全日期格式化解析(替代 SimpleDateFormat)
2026-10-30 16:25:55
220
原创 System 类、Math 类、Random 类
System 管系统,毫秒数组和退出;Math 做数学,上下取整幂和 π;Random 造随机,种子固定序列定;random 半开区间,取不到上限值。:从 1970-01-01 00:00:00 UTC 到现在的毫秒数。伪随机:由种子通过算法算出数字;种子相同,随机序列完全一样。注意:下标不能越界,否则抛数组下标越界异常。,用来生成伪随机数,可控种子。JVM 回收,不一定立刻执行。
2026-10-29 19:29:12
88
原创 StringBuffer、StringBuilder
String:不可变,每次修改生成新对象;适合内容不经常变动、少量拼接;==比较坑,比较内容用equals:可变、线程安全、速度慢;多线程共享字符串时使用:可变、线程不安全、速度最快;日常开发首选。
2026-10-29 19:26:48
67
原创 包装类知识
Java 是面向对象语言,但基本数据类型(intdouble等)不是对象。为了让基本类型也能像对象一样使用,Java 为每个基本类型提供了对应的 “包装类”。基本数据类型包装类byteByteshortShortintIntegerlongLongfloatFloatdoubleDoublecharCharacterbooleanBoolean,其他基本类型都是首字母大写。
2026-10-29 19:23:16
47
原创 队列基础知识
队列是只允许在一端插入、另一端删除的线性表队尾 rear:插入元素(入队 enqueue)队头 front:删除元素(出队 dequeue)空队列:队列里面没有元素。
2026-10-26 19:39:07
178
原创 栈的四则运算、栈的递归应用
递归到终止条件时逐层返回,不断出栈。栈的 LIFO 完美匹配递归 “先调用、后返回”。,把递归改成非递归。,从左往右扫描,遇到数字入栈,遇到运算符弹出两个数计算。每一次递归调用,都会把当前函数的局部变量、参数、返回地址压入。⚠️ 缺点:朴素递归大量重复计算,同时递归深度大,容易栈溢出。,先 pop 得到 2,再 pop 得到 6 →。,再用一个栈计算后缀表达式。很多场景不允许递归(防止栈溢出),我们可以。栈里保存每一层现场,后进先出返回。⚠️ 重点易错:先弹出的是。四则运算另一条路线:先把。
2026-10-26 19:36:10
187
原创 栈基础知识
栈是只允许在一端进行插入和删除操作的线性表。栈顶(top):允许插入、删除的一端;栈底(bottom):固定不动,不做增删;入栈(push):向栈顶添加元素;出栈(pop):从栈顶取出元素;空栈:栈中没有任何元素。#define MaxSize 10 // 栈最大容量,固定长度// 顺序栈结构体int top;// 栈顶指针,初始为0,代表空栈} SqStack;data[]:数组,存放栈元素;top = 0:空栈;:栈满;入栈:先放元素,top++;
2026-10-26 19:31:20
221
原创 String 类基础知识
String 不可变,所有方法都不会修改原字符串,必须接收返回值// ❌错误!没有接收返回值,s仍然是abc// ✅正确,接收新字符串isEmpty()只判断长度 0,直接空指针,先判断!=null 再调用substring 是左闭右开,end 位置取不到split 的参数是正则,分割点是小数点、星号等一定要转义==对比地址,比较字符串内容一律用equals()
2026-10-20 21:51:47
194
原创 异常基础知识
JDK 自带的异常(等)描述的是通用错误。业务场景下的错误,例如:用户名不存在、余额不足、年龄非法,JDK 没有对应的异常类。自己创建异常类,用来表示项目特有的业务错误,方便区分异常类型,做针对性捕获处理。自定义编译期异常(受检异常)继承Exception,编译时强制处理,必须 try-catch 或者 throws 抛出。自定义运行时异常(非受检异常)继承,编译不强制处理,运行时报错,开发中更常用。开发推荐:业务异常一般继承,不用每次都写 throws。
2026-10-11 01:16:32
158
原创 throw/throws 关键字
throws写在,用于,把异常交给调用这个方法的人去处理。一句话区分:throws 是,自己不捕获,抛给上层调用者。和 try-catch 的区别:try-catch 是;throws 是。
2026-10-11 01:16:01
159
原创 finally语句
finally几乎一定执行,只有退出 JVM 才会跳过;try/catch 中的 return,不会阻止 finally 执行;finally 在 return 返回前执行;资源清理,不要写业务逻辑;禁止在 finally 块写 return,会掩盖异常、修改返回值;finally 不能单独使用,必须依附 try。
2026-10-11 01:14:40
158
原创 try-catch语句
try 里面只有发生异常那一行后面的代码不会执行,try 前面不受影响;子类在前,父类在后;try 不是必须搭配 catch,可以,但是不能单独写 try;catch 只能捕获声明的异常类型;类型不匹配,捕获失败,程序崩溃;try-catch 是捕获处理,不是消除代码本身 bug,只是避免程序直接终止。
2026-10-11 01:14:10
154
原创 内部类知识
把一个类定义在另一个类的里面,里面的类叫内部类,外面的类叫外部类。成员内部类局部内部类静态内部类(静态成员内部类)匿名内部类核心特点:内部类可以直接访问外部类所有成员(包括私有成员);外部类访问内部类成员,需要先创建内部类对象。写在外部类的成员位置(和成员变量、成员方法同级,不在方法里面)。class Outer{ //外部类// 成员变量private String name = "外部类私有属性";// 成员内部类// ✅内部类可以直接访问外部类的私有成员。
2026-10-11 01:13:22
129
原创 异常基础知识
异常,就是程序运行过程中出现的非正常情况。当代码出现错误,JVM 会创建异常对象,封装错误信息,然后终止程序。注意:语法错误不属于异常!语法错误在编译阶段就无法通过,根本不能运行;异常是代码编译成功,运行的时候才发生的错误。Throwable 分为 Error(无法处理)和 Exception(需要处理)Exception 分编译时异常(强制处理)、运行时异常(不强制)处理异常两种方式:try-catch 捕获,throws 抛出给上层调用者finally 用于资源释放,必定执行。
2026-10-10 23:24:53
268
原创 方法引用知识
方法引用是Lambda 表达式的进一步简化写法,属于语法糖。当 Lambda 表达式里面仅仅只是调用一个已经存在的方法,并且参数、返回值完全匹配,就可以使用方法引用,省去参数传递的书写。双冒号。
2026-10-10 23:20:32
112
原创 Lambda 表达式和函数式接口
就算不写 final 关键字,也属于有效 final,可以访问。作用:专门用来支持 Lambda 表达式,Lambda 就是用来实现这个唯一抽象方法。❗ 如果接口有 2 个及以上抽象方法,不能使用 Lambda,只能用匿名内部类。场景:Lambda 里面仅仅是调用一个已经存在的方法,就可以继续简化为。,底层依然生成对应实现类,简化函数式接口匿名内部类的冗余代码。和匿名内部类区分:匿名内部类的 this 指向匿名内部类自己。语法糖:编译器层面简化写法,没有新增底层语法。,不是 Lambda 本身。
2026-10-10 23:17:35
267
原创 内部类知识
把一个类定义在另一个类的里面,外面的类叫外部类,里面的类叫内部类。成员内部类局部内部类静态内部类(静态成员内部类)匿名内部类核心特点:内部类可以直接访问外部类所有成员(包括私有成员);外部类访问内部类成员,需要先创建内部类对象。专门简化函数式接口的匿名内部类,属于匿名内部类场景的语法糖。写在外部类的成员位置(和成员变量、成员方法同级,不在方法里面)。class Outer{ //外部类// 成员变量private String name = "外部类私有属性";// 成员内部类。
2026-10-10 23:12:08
181
原创 Object 类
地位是 Java 中所有类的根父类。如果一个类定义时没有写extends继承任何类,默认直接继承 Object;所有类都间接或直接继承 Object,所以所有对象都能调用 Object 中的方法。java.lang包下的类,不需要手动 import 导入,直接使用。口诀:万物皆 Object。方法原生功能开发常用操作toString()返回类名 @哈希地址重写,输出对象属性equals()==比较对象地址重写,比较对象内容hashCode()返回对象哈希值。
2026-10-10 23:02:33
208
原创 instanceof 关键字
instanceof判断真实 new 出来的对象,不是左边的引用类型。//a是Animal引用,但是new的是Dog,所以 a instanceof Dog → true两个类没有继承 / 实现关系,使用 instanceof 直接编译报错。null instanceof 任何类→ false,不会抛空指针。只用来做引用类型对象判断,不能用于基本数据类型(int、double 等)。if(对象 instanceof 子类){ 强制转型,调用子类特有方法 }。
2026-10-02 10:17:28
87
原创 对象类型的转换
对象类型转换发生在有继承关系的父子类之间向上转型、向下转型。注意:基本数据类型转换 和 对象引用类型转换 完全不一样,不要混淆。自动转换,安全,不会抛出异常;可以调用父类拥有的方法,如果子类重写,执行子类方法;不能访问子类独有的成员与方法;使用场景:方法参数、返回值,实现多态,提升扩展性。
2026-10-02 10:14:53
209
原创 多态基础知识
⚠️坑点:多态引用访问成员变量,不会调用子类的成员变量,只看引用的父类类型。重点:编译看左边(父类),运行看右边(子类) 编译:检查父类有没有该方法;运行:执行子类重写后的方法。通俗理解:同样是动物叫,狗是汪汪汪,猫是喵喵喵,同一个 “叫” 行为,不同对象表现不一样,就是多态。父类引用指向子类对象,调用重写方法时,会执行子类重写后的逻辑。:判断该对象是不是这个类 / 子类的实例,返回 boolean。子类对象自动转为父类类型,安全,不需要强转。风险:如果实际对象不是目标子类,运行抛出。
2026-10-02 10:09:51
229
原创 接口基础知识
/ 抽象方法:规定“能飞”void fly();抽象方法;默认方法default;静态方法static;私有方法private。抽象方法 + 类实现接口。
2026-10-02 10:06:48
178
原创 抽象类基础知识
使用abstract关键字修饰的类,叫做抽象类。public abstract class 类名 {它可以定义普通属性和方法;也可以定义抽象方法;它不能直接创建对象,必须靠子类继承并实现抽象方法。使用abstract修饰,并且没有方法体的方法。public abstract void 方法名();抽象方法只有方法声明;没有{ }方法体;必须用abstract修饰。
2026-10-02 10:02:17
231
原创 final 关键字
final是最终、不可改变的意思,可以用来修饰类、方法、变量。被 final 修饰之后,内容就不能被修改,不同修饰对象效果完全不同。修饰对象作用效果final 修饰类类不能被继承;类中方法默认 final 效果final 修饰方法方法可以继承,不能重写final 修饰局部变量只能赋值 1 次,值不可更改final 修饰实例成员变量对象创建前完成唯一赋值,不可修改static final 静态常量类加载阶段赋值,全局常量,名字大写final 修饰引用类型。
2026-10-01 09:11:02
189
原创 super关键字
super代表父类对象的引用,专门用于子类中访问父类的内容,和thisthis:代表当前本类对象,访问本类的成员super:代表父类对象,访问父类的成员注意:super 只能在子类中使用,只能作用于非静态方法 / 构造方法中,static 静态方法里不能写 super。关键字指代对象使用位置作用this当前本类对象普通方法、构造方法访问本类变量、本类方法、调用本类其他构造super父类对象引用子类普通方法、子类构造方法访问父类变量、父类方法、调用父类构造。
2026-10-01 09:06:57
152
原创 继承与方法的重写
继承是面向对象三大特性之一,使用extends关键字,让子类(派生类)拥有父类(超类 / 基类)的非私有属性和方法。提高代码复用性,减少重复代码,实现代码的扩展。父类:存放多个子类共有的公共成员子类:除了拥有父类内容,还可以写自己独有的属性与方法。
2026-10-01 09:04:36
165
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅