- 博客(42)
- 收藏
- 关注
原创 Java·对象的比较
场景实现方式关键规则判断是否同一对象==运算符引用类型比较地址,基本类型比较值判断内容是否相等重写equals()遵守 5 大特性,核心属性对比哈希集合去重同时重写equals()和hashCode()相等对象哈希码必须相等对象排序Comparable(自然序)/Comparator(定制序)返回正负 / 0 表示大小关系。
2025-12-16 14:28:00
636
原创 Java·优先队列PriorityQueue
siftUp 是「自下而上」找位置(插入用),siftDown 是「自上而下」找位置(删堆顶 / 堆化用),最终都是为了让堆满足「最小 / 最大堆」的核心规则。
2025-12-14 15:00:06
657
原创 Java·二叉树
递归遍历的终止条件)不可遗漏;BST 的中序遍历是升序,是解决 BST 相关题的关键;完全二叉树的顺序存储索引计算(父i→左2i+1、右2i+2红黑树与 AVL 的区别:AVL 平衡更严格(旋转多),红黑树插入删除效率更高;空树的深度定义(通常为 0,需与题目一致)。
2025-11-28 14:43:02
583
原创 栈与队列:Java开发必知必会
栈和队列的本质是线性表(元素按顺序存储),但对插入(入栈 / 入队)和删除(出栈 / 出队)操作的位置做了限制,因此也被称为 “受限线性表”。二者的核心差异在于操作顺序规则,决定了其适用场景的不同。
2025-11-27 15:08:20
689
原创 Java·LinkedList与链表
LinkedList 底层是「双向循环链表」,节点包含 prev/next/item 三部分;实现 Deque 接口,支持队列(FIFO)、栈(LIFO)、双端操作;与 ArrayList 的核心区别:随机访问效率(ArrayList 更优)、首尾插入删除效率(LinkedList 更优);时间复杂度:首尾操作 O (1),随机访问 / 中间插入删除 O (n);非线程安全,遍历需避免普通 for 循环,推荐迭代器。
2025-11-26 17:51:33
882
原创 Java·线性表、顺序表、ArryList
由n(n≥0)个同类型数据元素组成的有限序列,元素间是“一对一” 逻辑关系(除首尾元素外,每个元素有唯一前驱和后继)。使用连续的物理空间(数组)存储元素,元素的逻辑顺序与物理顺序完全一致即第 i 个元素的物理地址 = 起始地址 + i× 元素大小逻辑层面:线性表定义了元素 “一对一” 的线性关系,是抽象概念;存储层面:顺序表用连续数组实现线性表,核心是 “随机访问快、插入删除慢”;实现层面:ArrayList 是 Java 对顺序表的优化(动态扩容),是开发中最常用的 List 实现类。
2025-11-25 15:40:04
756
原创 Java·关于List
List 是Collection接口的子接口,用于存储有序、可重复有序性:元素的插入顺序与存储顺序一致,支持通过索引(0 起始)访问元素;可重复性:允许存储多个相同的元素(包括null索引操作:提供了基于索引的增删改查方法(这是 List 与 Set 最核心的区别)。
2025-11-25 12:12:47
706
原创 Java·泛型的基本知识
Java 泛型的核心是类型参数化,通过编译期类型校验实现安全、简洁、可复用的代码。关键要点:核心场景:泛型类、泛型接口、泛型方法(静态方法需单独声明泛型)。通配符:无界()、上界(extends T>,读)、下界(super T>,写),遵循 PECS 原则。特性:类型擦除(编译时特性,运行时无泛型信息),需注意其带来的限制。价值:解决类型转换冗余和运行时类型错误,是集合框架、框架工具(如 Spring、MyBatis)的核心基础。
2025-11-25 11:42:42
795
原创 Java·时间复杂度和空间复杂度
算法执行过程中「基本操作的执行次数」随数据规模n增长的趋势(不关注具体执行时间,只关注 “增长快慢”)。用大 O 记法(O-notation)表示,核心是「保留最高次项,忽略常数、低次项和系数」。算法运行过程中「所需存储空间」随数据规模n增长的趋势,重点关注「额外辅助空间」(不包含输入数据本身的存储空间)。复杂度的核心是「增长趋势」,而非具体数值,优先选择低量级复杂度(O (1) < O (log n) < O (n) < O (n log n));
2025-11-24 12:51:23
708
原创 Java·初级集合框架
1. 核心作用存储多个对象(引用类型,基本类型需用包装类);提供增删改查、排序、遍历、筛选等通用操作;屏蔽底层数据结构细节(如数组、链表、红黑树),降低开发成本。2. 顶层架构(核心接口)Java 集合框架分为单列集合(存储单个元素)和双列集合│ Iterable │ // 所有可遍历集合的根接口(提供 iterator() 方法)↓│ Collection │ // 单列集合根接口(定义增删改查、大小判断等通用方法)
2025-11-24 12:05:37
552
原创 Java·String类
String 类的核心是 “不可变性”常量池的存储机制、equals与==的区别、字符串拼接的效率选择,以及常用方法的使用场景。这些知识点既是开发中的高频应用点,也是面试的核心考点,需结合内存模型和实际场景理解,避免踩坑。
2025-11-24 09:50:38
1171
原创 Java·Object类
Object类是 Java 面向对象的基石,其核心价值在于定义了所有对象的通用行为。重点掌握equals()hashCode()toString()的重写规范,wait()notify()的线程同步用法,以及浅拷贝与深拷贝的区别,这些也是面试高频考点。
2025-11-23 19:13:31
819
原创 Java·关于Clonable 接口和深拷贝
当对象被浅拷贝时,会创建一个新的对象实例,但对象中的引用类型成员变量不会被复制(新对象和原对象共享同一个引用类型成员)。“拷贝对象本身,不拷贝对象里的‘引用子对象’”。深拷贝会创建一个完全独立的新对象:不仅拷贝对象本身,还会递归拷贝对象中所有可变的引用类型成员变量,最终新对象和原对象的引用类型成员指向不同的内存地址,互不影响。“拷贝对象本身 + 拷贝对象里所有的‘引用子对象”。Cloneable是 “允许克隆” 的标记接口,默认支持浅拷贝,核心依赖;
2025-11-20 22:27:57
1039
原创 Java·抽象类和接口
1. 定义与核心作用定义:用abstract关键字修饰的类,是“不完整的类”(可能包含未实现的抽象方法)。核心作用抽取多个子类的共性属性和行为(体现 “is-a” 关系,如强制子类实现核心抽象行为(通过抽象方法);阻止直接实例化(抽象类本身不完整,实例化无意义)。2. 语法规则与特点3. 代码示例// 抽象类:抽取动物的共性(属性+行为)// 普通成员变量// 常量// 构造方法(供子类调用)// 抽象方法(强制子类实现“吃”的行为)// 非抽象方法(子类可直接继承)
2025-11-20 14:12:32
1032
原创 Java·搞懂动态绑定
动态绑定(也叫「运行时绑定」):调用多态方法时,Java 编译器在编译阶段,只知道 “父类引用有这个方法”,但不知道这个引用实际指向的是哪个子类对象;只有等到程序运行起来,JVM 才会根据「对象的真实类型」,找到并执行对应的子类重写方法。形象比喻(景区调度场景)编译时:调度员(编译器)拿到的是一张「景区交通工具」的通用调度单(父类引用),只知道 “所有交通工具都能跑(run 方法)”,但不知道这张调度单最终会分配给自行车、观光车还是缆车;1. 动态绑定的本质。
2025-11-19 22:46:45
888
原创 Java·一篇文章搞懂多态
父类引用指向子类对象时,通过该引用调用 “被子类重写的方法”,实际执行的是子类的实现,而非父类的实现。用简单的方式说就是:“一个引用,多种形态”—— 引用的类型是父类,但指向的对象是子类,调用方法时会 “适配” 子类的具体行为。优先用接口而非抽象类:接口更灵活(支持多实现),能拆分职责(如SoundableFlyable),避免父类职责过重;父类 / 接口只定义 “通用规范”:不包含子类特有的逻辑,避免限制子类扩展;减少向下转型。
2025-11-19 21:50:40
925
原创 Java·向上转型和向下转型
向上转型是“简化身份”,自动、安全,用于多态场景”(比如用父类作为方法参数,接收任意子类对象);向下转型是“还原身份”,强制、不安全,必须用instanceof判断后再转,用于需要使用子类特有功能的场景”;“向上转型依赖 “is a” 关系,向下转型依赖 “实际对象类型匹配”。用一句话记住:向上转不用强转,只能用父类的活;向下转必须强转,先判断再干活。t=P9T8。
2025-11-19 17:30:08
688
原创 Java·关于异常处理
场景:Java内置异常无法满足业务需求时(如 “用户余额不足”)。实现:继承Exception(受检)或(非受检),并提供构造方法。示例:// 自定义受检异常。
2025-11-11 17:58:36
584
原创 JAVA·继承①
继承:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性 的基础上进行,这样产生新的类,称。继承呈现了面向对象程序设计的层次结构, 体现了 由简单到复杂的认知过程。
2025-10-19 19:31:26
534
原创 JAVA·类和对象③封装及包
本文介绍了Java面向对象编程中的封装和包的概念。封装通过类和访问权限实现数据隐藏,Java提供四种访问限定符:public、default、private和protected。包是类的组织方式,可避免命名冲突并控制访问范围。文章详细说明了如何导入系统包中的类(包括静态导入),以及创建自定义包的规则和步骤,强调包名应具有唯一性并与代码路径匹配。最后列举了Java中常见的系统包及其用途,如java.lang、java.util等核心功能包。
2025-10-14 21:06:09
652
原创 JAVA·类和对象②对象的构造及初始化
本文介绍了Java中对象初始化的相关知识。主要内容包括:1.局部变量必须初始化而成员变量可以不用初始化的区别;2.构造方法的概念、特性及使用方法,包括构造方法重载、this调用其他构造方法等;3.对象创建时JVM层面的初始化过程,解释了成员变量默认初始化的机制;4.就地初始化的方法及编译器处理方式。文章通过代码示例详细说明了如何正确使用构造方法进行对象初始化,并解释了Java在对象创建时的底层处理机制。
2025-10-13 19:45:57
395
原创 JAVA·类和对象①
本文介绍了Java面向对象编程的基础概念。重点阐述了类的定义与使用,包括类的基本结构、成员变量和方法的定义规范。详细说明了类的实例化过程,通过new关键字创建对象,并解释了类与对象的关系,将类比作设计图,对象则是具体实现。此外,还讲解了this引用的概念及其特性,指出this是成员方法的隐式参数,用于指向当前调用对象。文中强调了一些编码规范,如类名采用大驼峰命名、一个文件通常只定义一个类等注意事项。
2025-10-12 20:13:18
867
原创 JAVA·数组的定义与使用
本文介绍了Java数组的基本概念和使用方法。主要内容包括:1)数组的创建与初始化,分为动态初始化和静态初始化;2)数组元素访问和遍历方法,强调数组下标从0开始;3)数组作为引用类型的特点,解释其在JVM内存中的存储方式;4)数组的应用场景,如保存数据、作为函数参数和返回值。特别指出数组作为引用类型传参时只传递地址而非拷贝整个数组,可提高效率。文章还通过斐波那契数列示例展示了数组作为函数返回值的应用。
2025-10-11 23:11:06
973
原创 JAVA·方法的使用
/ 方法定义修饰符 返回值类型 方法名称([参数类型 形参 ...]){方法体代码;[return 返回值];修饰符:现阶段直接使用public static固定搭配。返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致,如果没有返回值,必须写成 void。方法名字:采用小驼峰命名。参数列表:如果方法没有参数,()中什么都不写,如果有参数,需指定参数类型,多个参数之间使用逗号隔开。方法体:方法内部要执行的语句。方法必须写在类当中。方法不能嵌套定义。没有方法声明一说。
2025-10-10 20:14:55
294
原创 JAVA中数据类型与变量
再进行计算,得到的结果也是 int,这是赋给 c,就会出现上述错误。由于表示的数据精度范围较小,一般在工程上用到浮点数都优先考虑 double,不太推荐使用 float。在Java中,当不同类型之间的变量相互赋值的时候,会有教严格的校验。注意:字符串、整型、浮点型、字符型以及布尔型,在JAVA中都被称为。强制类型转换:当进行操作时,代码需要经过一定的格式处理,不同类型的数据之间相互运算时,数据类型小的会被提升到数据类型大的。,如:年龄、体重、分数、班级等等,都被称为变量。2. byte与byte的运算。
2025-09-24 21:19:29
890
原创 初识JAVA
作为日专生,着实想感慨一声不容易,这种从文到理学习思维的转换,也让刚开始起跳的我有了些许难度,所幸是度过。学完C后,对自己的职业也有了更清晰的认知和规划,现在开始学JAVA,也是踏出的另外重要一步吧,共勉。如果想加一个“牛肉”来做“西红柿牛肉”,你只需要创建一个新的“牛肉”对象,定义它的属性和行为(切块、腌制),然后让“厨师”来操作它即可,不需要改动太多现有代码。JAVA不支持指针,使用使用“引用”概念,但无法操作地址。1.拿出西红柿,洗干净,切成块。4.你.自己执行“开火”、“倒油”、“炒”等行为。
2025-09-21 21:24:00
522
原创 操作符详解(下
/代码1:变量的定义int x;int y;}p1;//声明类型的同时定义变量p1//定义结构体变量p2//代码2:初始化struct Stu //类型声明int age;//初始化//指定顺序初始化//代码3int date;//结构体嵌套初始化//结构体嵌套初始化。
2024-12-05 22:07:55
994
原创 操作符详解(上
算术操作符:移位操作符:<< >>位操作符:& | ^赋值操作符:+=-=*=/=%=<<=>>=&=|=^=单⽬操作符:!++--sizeof类型关系操作符:>=<===!逻辑操作符:&&||条件操作符:?逗号表达式:下标引⽤:[]函数调⽤:()结构成员访问:->
2024-12-05 20:42:08
1072
原创 C语言—函数递归
递归其实是一种解决问题的方法,在C语言中,递归就是函数自己调用自己。注意:上述代码仅是为了演示递归基本形式,代码最终会陷入死递归,导致栈溢出(Stack overflow)。
2024-12-04 23:34:37
1171
原创 VS实用调试技巧
当我们发现程序中存在的问题的时候,那下一步就是找到问题,并修复问题。这个找问题的过程称为调试,英文叫debug(消灭bug)的意思。调试一个程序,首先是承认出现了问题,然后通过各种手段去定位问题的位置,可能是逐过程的调试,也可能是隔离和屏蔽代码的方式,找到问题所在的位置,然后确定错误产生的原因,在修复代码,重新测试。
2024-12-04 16:46:34
876
原创 数组和函数实践:扫雷游戏
再继续分析,我们在棋盘上布置了雷,棋盘上的雷的信息(1)和非雷的信息(0),假设我们排查了某一个位置后,这个坐标处不是雷,这个坐标的周围有1个雷,那我们需要将排查出的雷的数量信息记录存储,并打印出来,作为排雷的重要参考信息的。那这个雷的个数信息存放在哪里呢?假设我们排查(8,6)这个坐标时,我们访问周围的一圈8个黄色位置,统计周围雷的个数时,最下面的三个左边就会越界,为了防止越界,我们这在设计的时候,给数组扩大一圈,雷还是布置在中间的9*9的坐标上,周围一圈不去布置雷就行,这样就解决了越界的问题。
2024-12-03 17:45:23
968
原创 C语言-函数(下
一般我们在使用函数的时候,直接将函数写出来就使用了。比如:我们要写一个函数判断一年是否是闰年。//判断一年是否为闰年return 1;if(r == 1)printf("闰年\n");elseprintf("非闰年\n");return 0;在4-10行是函数的定义,而第16行是函数的调用。
2024-11-21 22:15:28
671
原创 C语言—数组
从输出结果来看,每一行内部的每个元素都是相邻的,地址之间相差4个字节,跨行位置处的两个元素(如:arr[0][4]和arr[1][0])之间也是相差4个字节,所以。而且数组中存放的是多个类型相同的数据。从输出结果来开,数组随着下标的增长,地址是由小到大变化的,并且每两个相邻的元素之间相差4(因为一个整型是四个字节)。需要注意的是变长数组中的“变”,指的是数组的大小可以用变量来指定,而不是数组的大小可以改变。其好处是,程序员不必再开发室,随意为数组制定一个估计的长度,程序可以在运行时为数组分配精确的长度。
2024-11-02 18:50:35
1085
1
原创 C语言分支和循环(下
加上 srand 函数之后,只是让 rand 函数初始化了而已,我们想要真正生成一个随机值,就要让“种子”始终保持一个一直变化的值,还需要用到 time 函数。我们要生成不同的随机数,就不要让种子为默认值,而是随机变化的,但首先我们先要让种子初始化,不让它以默认值进行,这个时候就需要用到srand函数。rand 生成的始终是一个伪随机值,它是对一个叫“种子”的基准值进行运算生成的, rand 函数生成随机数的默认种子是1。,所以无论我们运行多少次,输出的结果都是一样的。很明显这不是我们想要的结果。
2024-07-28 17:23:17
679
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅