- 博客(52)
- 收藏
- 关注
原创 Java接口深度解析
基础语法:// 接口声明// 常量(默认 public static final)String CONSTANT = "接口常量";// 抽象方法(默认 public abstract,可省略修饰符)// 默认方法(Java 8+,有方法体)System.out.println("默认方法实现");// 静态方法(Java 8+,通过接口名直接调用)System.out.println("静态方法实现");// 实现接口的类// 必须实现抽象方法@Override。
2025-04-11 21:03:59
419
原创 Java抽象类与抽象方法详解
设计意图:当多个子类具有共性行为但具体实现不同时,通过抽象类强制规范子类的实现格式。典型场景// 定义抽象图形类// 抽象方法:计算面积(无法确定具体实现)// 具体子类实现@Override// 圆形面积计算@Override// 矩形面积计算强制约束包含抽象方法的类 必须声明为抽象类子类 必须实现所有抽象方法(除非子类也是抽象类)语法规则[访问修饰符] abstract 返回值类型 方法名(参数列表);示例说明。
2025-04-10 22:42:23
324
原创 Java代码块详解:分类、作用与最佳实践
特性局部代码块构造代码块静态代码块执行次数每次方法调用每次new对象类加载一次存储位置栈内存堆内存方法区是否可抛异常可处理可处理需捕获或终止加载访问权限仅限方法内部可访问实例变量仅访问静态成员理解静态代码块的 一次性初始化 机制避免构造代码块的 滥用风险认识局部代码块的 历史局限性在实际开发中,建议结合IDE的代码分析工具(如IntelliJ IDEA的。
2025-04-10 21:44:47
604
原创 Java权限修饰符深度解析
Java提供四种访问控制修饰符,按访问范围从宽到窄排序如下:访问范围:所有类均可访问使用场景:示例: 访问范围:使用场景:示例: 访问范围:仅同包类可见使用场景:示例: 访问范围:仅本类可见使用场景:示例: 2. 构造函数访问控制 最小化公开元素 优先使用最严格的访问级别(推荐顺序): → 默认 → → 数据封装原则 3.接口方法
2025-04-10 21:22:00
420
原创 (每日一道算法题)最长回文子串
中心扩展法通过利用回文串的对称性,高效地解决了最长回文子串问题。其核心思想是从每个可能的中心向两侧扩展,寻找最大回文。相比于动态规划等其他方法,中心扩展法在空间复杂度上更具优势,且代码简洁易懂。
2025-03-27 23:20:50
308
原创 (每日一道算法题) K 个一组翻转链表
本解法通过头插法实现每组的翻转,利用虚拟头节点简化连接逻辑,通过前驱指针维护各组之间的连接。思路清晰,代码简洁高效。适用于对链表操作较为熟悉的开发者,重点在于理解头插法的翻转逻辑和指针的更新策略。
2025-03-26 21:09:43
421
原创 (每日一道算法题)合并 K 个升序链表
给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。链表数组如下:1->4->5,1->3->4,2->6将它们合并到一个有序链表中得到。
2025-03-25 21:02:37
276
原创 (每日一道算法题)两数相加
该解法通过逐位相加并维护进位,高效处理了逆序链表的相加问题。使用哑节点简化了链表操作,确保代码简洁且鲁棒性强。通过合理处理边界条件(如链表长度不同、最终进位),保证了算法的正确性。
2025-03-25 11:20:22
228
原创 (每日一道算法题)翻转对
降序排序的必要性:保证右子数组元素从前往后递增,使得统计时能利用有序性快速定位。独立统计阶段:必须在合并前单独统计,避免遗漏可能的翻转对。防止整数溢出:比较时使用long类型(如。
2025-03-23 21:36:24
899
原创 (每日一道算法题)交易逆序对的总数
在股票交易中,如果前一天的股价高于后一天的股价,则可以认为存在一个「交易逆序对」。请设计一个程序,输入一段时间内的股票交易记录record,返回其中存在的「交易逆序对」总数。8交易中的逆序对为 (9, 7), (9, 5), (9, 4), (9, 6), (7, 5), (7, 4), (7, 6), (5, 4)。
2025-03-21 20:24:55
394
原创 (每日一道算法题)排序数组
稳定时间复杂度:无论输入数据如何分布,始终保证 O(n log n)天然稳定性:保持相等元素的原始顺序(本题虽不要求,但属于重要特性)分治结构:适合处理大规模数据,且易于并行优化与快速排序相比,避免了最坏情况 O(n²) 的风险;与堆排序相比,具有更好的缓存局部性。
2025-03-21 10:56:55
335
原创 Java多态:三大特性解析与实战应用
定义:多态指“对象的多种形态”。它允许不同类的对象对同一消息作出不同响应,如同一操作作用于不同的对象时产生不同的行为。通俗比喻狗调用叫()方法会输出“汪汪”猫调用叫()方法会输出“喵喵”同一个行为(叫),不同对象(狗/猫)表现不同,这就是多态。类型编译时多态:方法重载(Overload)运行时多态:方法重写(Override)
2025-03-18 17:17:45
326
原创 Java继承中的成员变量,成员方法,构造方法访问特点详解
父类静态块 → 子类静态块 → 父类实例块 → 父类构造方法 → 子类实例块 → 子类构造方法。,该操作由编译器在子类构造方法首行隐式插入。,且必须是子类构造方法的第一条语句。,但可通过方法重载实现不同参数构造。当需要调用父类有参构造时,必须。示例:父类无无参构造时的处理。Parent.变量名。
2025-03-17 17:02:36
337
原创 (每日一道算法题)数组中的第 k 个最大的元素
给定整数数组nums和整数k,请返回数组中第k个最大的元素。请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。你必须设计并实现时间复杂度为O(n)的算法解决此问题。
2025-03-16 11:26:07
356
原创 (每日一道算法题)数青蛙
给你一个字符串,它表示不同青蛙发出的蛙鸣声(字符串"croak")的组合。由于同一时间可以有多只青蛙呱呱作响,所以中会混合多个“croak”。请你返回模拟字符串中所有蛙鸣所需不同青蛙的最少数目。要想发出蛙鸣 "croak",青蛙必须输出这 5 个字母。如果没有输出全部五个字母,那么它就不会发出声音。如果字符串不是由若干有效的 "croak" 字符混合而成,请返回-1。1一只青蛙 “呱呱” 两次2最少需要两只青蛙,“呱呱” 声用黑体标注第一只青蛙 "croak"第二只青蛙 "croak-1。
2025-03-13 21:49:26
911
原创 Java继承机制深度解析:子类如何继承父类及内存原理解析
Java的继承机制通过内存预分配和权限分层控制,实现了代码复用与安全性的平衡。避免因权限问题导致的诡异Bug(如误认为子类不包含父类私有变量)优化代码结构(例如合理选择protected或final修饰符)深入掌握多态的实现原理(虚方法表与动态绑定)下次面对继承问题时,不妨从内存布局的视角重新审视,或许会有豁然开朗的体验!
2025-03-12 22:55:40
897
2
原创 深入理解Java中的static关键字及其内存原理
/ 静态变量(类变量)// 实例变量共享性:所有实例共享同一存储空间(Config.ENV生命周期:类加载时初始化,程序结束时销毁存储位置:JDK8+存放在元空间(MetaSpace),旧版本在方法区调用方式:推荐类名.方法名()(如访问限制:静态方法中无法使用this,不能直接访问实例成员深入理解static关键字需要把握其"类级别共享"的本质特征,同时要警惕滥用可能带来的内存问题和并发风险。
2025-03-10 23:11:40
464
原创 (每日一道算法题)外观数列解析
外观数列(Count and Say)是一个经典的递归定义序列,其特性是每个后续项都是对前一项的行程长度编码(Run-Length Encoding, RLE)。外观数列问题通过迭代法和双指针技巧高效实现,重点在于理解 RLE 的转换规则和字符串操作优化。和直接追加整数的设计,体现了 Java 高效处理字符串的最佳实践。虽然外观数列是递归定义的,但直接使用递归会导致重复计算。,要求返回该数列的第。
2025-03-10 16:40:14
413
原创 Java字符串拼接的底层原理与性能优化
理解Java字符串拼接的底层原理,能够帮助开发者避免性能陷阱,在代码可读性和效率之间找到平衡。在简单场景中信任编译器的优化,在复杂场景中主动选择高效工具(如),才能写出更健壮的代码。
2025-03-09 21:45:58
455
原创 优雅拼接字符串:StringJoiner 的完整指南
以极简的设计解决了字符串拼接中的常见痛点,尤其在与Stream API结合时,能大幅提升代码的简洁性和可维护性。无论是日志格式化、数据导出,还是动态查询构建,掌握都能让你的代码更加优雅高效。
2025-03-09 21:19:01
330
原创 StringBuilder常用方法详解
是 Java 中用于的类,位于java.lang包中。与不可变的String类不同,允许在的情况下直接修改字符串内容,适用于的场景。其线程不安全但性能更高,而是线程安全的替代方案。
2025-03-09 20:26:53
393
原创 Java中String常用方法详解
Java的String类提供了丰富的方法来简化字符串操作。掌握这些方法能大幅提升开发效率,但需注意不可变性带来的性能问题,在频繁修改时建议使用。建议通过实际编码练习巩固这些方法的应用!扩展思考:如何处理大量字符串拼接?何时应使用?欢迎在评论区讨论!
2025-03-08 16:28:36
1313
原创 寻找缺失的两个数字:异或法的高效解法
通过异或法,我们高效地解决了缺失两数的问题。关键在于利用异或性质确定两数的不同位,并分组处理。该方法在时间与空间复杂度上均达到最优,适用于大规模数据处理。
2025-03-07 17:47:50
659
原创 码农生存指南 | 防猝死篇:给代码续命不如给自己续命
凌晨三点的办公室,显示器蓝光映着你发青的脸,左手咖啡右手红牛,心跳声在安静的办公室里格外清晰——这个场景是不是过于熟悉?程序员的健康危机早已不是新闻,某大厂工程师连续加班后心脏骤停的新闻总在反复敲响警钟。今天我们不谈"福报",只谈科学续命。
2025-03-05 11:18:32
839
原创 LeetCode 974:和可被 K 整除的子数组
通过结合前缀和同余定理和哈希表,我们高效地解决了子数组和整除问题。这种方法的精髓在于将问题转化为余数统计,并利用哈希表快速查找历史记录。类似的思路还可以应用于其他子数组统计问题(如和为某个值的子数组)。
2025-03-03 18:18:00
495
原创 [负数%正数]的修正:为什么Java的取模结果需要手动调整?
在数学中,余数的定义是非负的,且满足:被除数=除数×商+余数,余数∈[0,除数)例如,数学中的-7 mod 3结果为2(因为),但Java的-7 % 3返回-1。两者虽然绝对值不同,但在模运算意义下等价(),但负余数可能导致程序错误。Java的取模运算符在负数场景下返回负余数,这可能导致程序错误(如数组越界、时间计算混乱等)。通过表达式,可以强制将余数修正到[0, p)区间,确保结果符合数学定义和工程需求。在需要严格非负余数的场景(如哈希表、循环队列、密码学算法等)中,这一修正方法至关重要。核心思想。
2025-03-03 17:33:59
361
原创 二分查找算法
在二分查找算法中,"二段性" 是一个至关重要的概念,它是理解二分查找能够正确工作的关键。在一个有序的序列中,可以将序列分成两个部分,其中一部分满足某个条件,另一部分不满足这个条件。这两个部分之间有一个明确的分界点,这个分界点就是我们要找的目标。假设我们有一个升序排列的数组,我们要查找目标值5。。根据这个条件,我们可以将数组分成两部分:[1, 3][5, 7, 9]这两部分之间的分界点就是5,也就是我们要找的目标值。分析问题是否可以定义一个条件,将序列分成两个部分。
2025-02-26 12:39:53
921
原创 滑动窗口:解决最小覆盖子串问题
最小覆盖子串问题是一个经典的滑动窗口问题。通过维护一个窗口,我们可以高效地找到满足条件的最小子串。滑动窗口的思想不仅适用于字符串问题,还可以用于数组、链表等其他数据结构的问题。希望这篇博客能帮助你更好地理解滑动窗口算法,并掌握解决类似问题的技巧!如果你有任何问题或建议,欢迎在评论区留言!
2025-02-20 23:30:27
283
原创 解决 LeetCode 串联所有单词的子串问题
通过滑动窗口和哈希表的方法,我们可以高效地解决这个问题。关键在于将问题分解为多个小步骤,并利用哈希表快速检查单词频率是否匹配。希望这篇博客能帮助你更好地理解这道题目的解法!
2025-02-20 21:44:37
925
原创 探访农场:如何用两个篮子摘到最多的水果?
你来到了一家农场,农场里种了一排果树,每棵树上都结着不同种类的水果。农场的主人给了你两个篮子,每个篮子只能装一种类型的水果。你可以从任意一棵树开始采摘,但必须按照从左到右的顺序,每棵树摘一个水果。一旦遇到不符合篮子中水果类型的水果,你就必须停止采摘。你的任务是:如何摘到最多的水果?这个问题可以抽象为一个数组问题:给定一个整数数组 ,其中 表示第 棵树上的水果类型。你需要找到一个最长的连续子数组,其中最多包含两种不同的水果类型。返回这个子数组的长度。示例 1:输入:输出:解释:你可以摘到全部 3 棵树的水
2025-02-19 10:50:11
256
原创 原码、反码、补码原理及其在Java中的应用
补码是核心:理解补码的生成规则(反码+1)和运算逻辑,是掌握Java强制转换和位操作的基础。强制转换的本质:直接截断补码的低位,可能导致符号和值的变化。位操作的底层逻辑:所有位操作符直接操作补码,符号位参与运算。和:按位逻辑运算,符号位同样处理。<<:左移补0,可能溢出。>>:右移补符号位,保持负数特性。>>>:右移补0,可能将负数转为正数。通过补码的视角,可以更清晰地理解Java中的数值存储、转换和位操作行为,从而避免因符号位或截断导致的意外错误。
2025-02-17 23:03:33
630
原创 一招教你解决DeepSeek R1的卡顿问题
首先,注册and登陆硅基流动官网。邀请码:JGJcx7F2登陆之后,直接就进入【模型广场】了。排在第一位的模型就是R1。但是你不用管,直接看最左边的导航栏,找到【API密钥】,点进去,再点右上角的新建API密钥。密钥描述这块可以随便写,别忘记这个密钥是做什么的就可以了新建完成之后,你就会得到一个看着是加密的API Key了,这就是你的密钥,点击密码那块就能复制。至此,你的API key就到手了,可以开始进行下一步了。需要注意秘钥别泄露了,本来就是白嫖的额度,泄露分分钟干完。
2025-02-16 21:10:23
238
原创 深入理解Java中的隐式类型转换
隐式类型转换,也称为自动类型转换,是指在不需要程序员显式指定的情况下,编译器自动将一种数据类型转换为另一种数据类型。这种转换通常发生在赋值、表达式计算或方法调用时。隐式类型转换的前提是目标类型的范围大于源类型,也就是说,转换不会导致数据丢失或精度损失。从小范围数据类型向大范围数据类型的转换:例如,从int到long,从float到double等。在表达式中,不同类型的操作数会自动提升为范围更大的类型:例如,int和double相加时,int会自动提升为double。方法调用时,实参类型自动转换为形参类型。
2025-02-16 20:38:11
655
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人