自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 构建一个最简单的UDP服务器和客户端并逐行解析

在 Java 网络编程中,**客户端(Client)服务器(Server)**是两个核心角色,它们共同构成了网络通信的基本模型(即以下我会构建一个最简单的服务器和客户端的代码。

2025-04-07 11:51:09 479

原创 TCP/IP五层协议

TCP/IP 五层协议模型是为了教学和理论分析而提出的分层框架,它结合了 TCP/IP 四层模型的实用性和 OSI 七层模型的细节性,更清晰地描述数据从应用程序到物理介质的完整传输过程。

2025-04-06 11:17:13 709

原创 多线程下使用哈希表

HashMap本身是不安全的,所以要在多线程下使用哈希表,我们可以使用:• Hashtable• ConcurrentHashMapHashtable 是 Java 早期提供的线程安全哈希表实现(),通过 全局锁(synchronized) 保证线程安全。简单来说,HashTable就是简单地把方法加上了synchronized关键字。这等于是直接对HashTable对象本身加锁。但是HashTable的性能较低

2025-04-06 08:47:18 600

原创 详解七大排序

记录每轮最后一次交换的位置,减少无效比较i++) {j++) {if (!

2025-04-05 22:00:55 1074 1

原创 堆与二叉树的关系

堆本质上是通过完全二叉树的结构约束和节点值的顺序约束实现的特殊数据结构。其数组存储方式和高效调整算法(heapify)的结合,使得堆在需要快速获取极值的场景中表现出色。理解堆与二叉树的关系,有助于掌握优先队列、堆排序等核心算法,并为学习更复杂的树结构(如AVL树、B树)奠定基础。

2025-04-05 15:18:46 626

原创 普通类、抽象类和接口的区别

Java 8+注意:接口现在可以有默认方法实现,这使得接口和抽象类的界限变得模糊。通常建议优先使用接口,除非需要非静态、非final的成员变量或需要控制子类构造过程时才用抽象类。

2025-04-05 10:52:03 484

原创 CAS: Compare-And-Swap(比较并交换)

CAS 操作包含三个参数:内存地址(V)、旧的预期值(A)以及新值(B)。仅当内存地址 V 处的值和旧的预期值 A 相同时,才会把该地址处的值更新为新值 B。ABA 问题指的是,在CAS 操作期间,内存地址 V 处的值先从 A 变成 B,之后又从 B 变回 A。这时,CAS 操作会认为值没有发生变化,从而继续执行更新操作,但实际上值已经经历了改变。

2025-04-04 18:21:10 579

原创 多线程编程中的锁策略

锁策略(Locking Strategies)是多线程编程中用于控制并发访问共享资源的核心机制。不同的锁策略在等方面有显著差异。

2025-04-04 11:51:21 797

原创 多线程中run方法和start方法的异同

在多线程编程中,run() 和 start() 是两种完全不同的方法,它们的核心区别在于 线程的启动和执行方式。

2025-04-04 10:19:27 267

原创 详解线程池的创建

线程池(ThreadPool)是一种多线程处理方式,它预先创建了一组线程并管理它们的生命周期,用于处理提交的任务。

2025-04-03 11:27:37 853

原创 数据库中的索引

数据库中的索引是一种数据结构,类似于书籍的目录,旨在提高查询效率。

2025-04-03 08:33:38 354

原创 详细分析单例模式

单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供全局访问点。单例模式常用于管理共享资源(如数据库连接池、线程池、配置对象等)。其中的设计模式指的是,是面向对象编程的经验总结。它们分为和三大类。简要说就是类似于框架,是大佬们提供的可供使用的一种“公式”。

2025-04-02 20:53:47 938

原创 力扣-203. 移除链表元素

给你一个链表的头节点head和一个整数val,请你删除链表中所有满足的节点,并返回。

2025-03-31 17:46:12 177

原创 牛客-mari和shiny

因为题中给出了n的取值范围:[0,300000],所以int类型是无法定义的.需要改用long类型来定义。

2025-03-29 09:11:26 657

原创 牛客网-旧键盘

创建一个set,将结果输入的字符串存放到里面,这个时候已经自动去重了.再创建一个srt,同时遍历原来输入的字符串,当出现set中没有存放的字符串的时候,就输出这个字符串并且添加到set中去.这样可以保证不会重复输出坏掉的键.输入在2行中分别给出应该输入的文字、以及实际被输入的文字。泛型中不可以使用基本数据类型,必须使用相应的泛型.要注意字符型char的对应泛型为Character,首字母大写.题目要求找出键盘坏掉的键,并且要求输出的字母是大写而且按照顺序没有重复,所以要用到HashSet的自动去重功能.

2025-03-27 21:13:36 316

原创 Set和Map的区别

/ 实际调用 map.put(1, PRESENT)// HashSet 存储唯一元素(底层是 HashMap 的键)names.add("Alice");// 重复元素,添加无效。:需要根据唯一标识(如 ID、名称)快速查找或关联数据。:若插入重复键,新值会覆盖旧值。// HashMap 存储键值对。:需要去重或判断元素是否存在。:过滤重复元素(如日志去重)。:快速判断元素是否在黑名单中。:键为单词,值为出现次数。:如数据库记录的键值存储。添加数据,自动去重。:用键快速查找缓存值。:交集、并集、差集(

2025-03-27 20:05:36 495

原创 力扣-138. 随机链表的复制

给你一个长度为n的链表,每个节点包含一个额外增加的随机指针random,该指针可以指向链表中的任何节点或空节点。构造这个链表的。深拷贝应该正好由n个节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的next指针和random指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。。例如,如果原链表中有X和Y两个节点,其中。那么在复制链表中对应的两个节点x和y,同样有。返回复制链表的头节点。用一个由n个节点组成的链表来表示输入/输出中的链表。

2025-03-27 19:47:48 629

原创 力扣-912-排序数组

快速排序的核心思想是选择一个元素作为基准值(pivot),将数组化为两部分,使得左边都是小于等于基准值的元素,右边都是大于等于基准值的元素.但是如果基准值选择不当,例如总是选择第一个元素或者最后一个元素作为基准值,可能出现。在本题目的测试用例中,有1个基本有序全是2的大数组,如果是不加优化的快速排序法,在运行时会超出时间限制.所以要进行快排的优化,快排的优化方案主要有两种:一是。是取出数组的首元素,末尾元素和中间元素,选择其中的中间值作为基准值.这种方式能有效地避免极端情况,使得分割更均匀.

2025-03-26 17:13:52 212

原创 二叉树遍历

在递归构建二叉树时,i变量需要在多次递归中保持递增,确保递归正常进行.所以必须在方法外定义,不然每次递归调用都会重新初始化i,导致无法正确跟踪当前处理到的字符位置.同一道题的i一样,preIndex需要定义在递归方法之外,来确保在多次递归当中,i的大小是递增的.

2025-03-23 15:07:58 219

原创 力扣-有效的括号

1.Character包装类Character是char的包装类,用于需要对象的场景,如泛型集合.在java数据类中,如stack中,必须使用包装类,不可以直接使用基本数据类型.java自动处理char和character之间的装箱和拆箱,使代码更简洁.注意首字母C要大写再进行左右括号匹配时,因为要用到栈的出栈方法pop,所以要先判断栈是否为空,如果是,证明根本没有左括号与右括号来进行匹配,一定为false.如果不添加判断,代码会因为空栈而报错.

2025-03-19 20:56:22 190

原创 牛客网-逆波兰表达式求值

else{在做题过程中,我因为错误地将自己创建的方法定义在了原来的方法中,导致代码错误,找了很久才找到,大家在做题过程中也要注意,不要因为这些细枝末节而通过不了代码.

2025-03-19 17:57:51 185

原创 力扣-两数相加

if(carry!=0){//处理最后的进位当跳出循环时,如果进位符carry没有置为0,则说明还需要向最高位借位进1.

2025-03-19 10:19:31 210

原创 力扣-环形链表

这道题的思路不难,就是定义两个快慢指针:fast和slow,fast和slow都从head开始,fast每次走两步,slow每次走一步,如果没有环,则fast会先到达链表的末尾.而如果存在环,fast和slow都出不去,这就变成了一个追击问题,他们早晚会相遇.在这个while循环中,if语句应该放到fast和slow的移动的下面,让代码先执行双指针的移动,再判断二者是否相等.否则,由于fast和slow两个指针的初始位置都是head,直接就会返回true.应当先移动双指针,让二者不相等后再进行判断.

2025-03-19 08:35:55 144

原创 牛客网-链表相交

4.当两条链表长度不相等时,我们可以算出哪一条链表长,让长的链表提前走完长度差的步数,这样,我们就又可以遍历链表,然后同时移动双指针了.2.如果头节点不一样,说明交点不是头节点.那就可以根据长度来判断,因为两条链表相交后的链表是一模一样的,所以长度也会一样.3.当两条链表长度相等时,直接遍历链表,同时移动双指针,当两条链表的节点相等时,就是我们要的节点.即两个链表的节点相等,注意这里不是交点的值相等,不然如果出现相同值的话,就会报错.这道题的目的是让找出两条相交链表的交点,返回这个节点.

2025-03-18 23:09:09 120

原创 杨辉三角java

这里的result在定义的时候决定了他是1个二维数组,也就是双重嵌套的顺序表,所以在调用它的get函数的时候,可以调用两次,一次得到他的行,一次得到他具体的值。通俗来说,也就是被static修饰的方法,可以采用类名.方法名来调用。这是一道非常简单的二维数组题,但是我做了很久才做出来,这让小编备受打击,其中有几个我在做题过程中遇到的疑问,弄了很久才终于搞清楚。而这里的generate没有被static修饰,属于实例方法,必须依赖于对象的调用。实例方法是指属于对象的方法,必须依赖于实例也就是对象的调用。

2025-03-15 22:02:43 358

原创 删除公共字符

这道题的主要思路是定义一个方法,遍历第一个字符串,如果第二个字符串包含第一个字符串的字符,则跳过.如果不包含,就用一个StringBuilder来接收.整体思路不难,但是我在写的过程中遇到了一个值得注意的点.这是除了indexOf之外的另一个查询字符是否在另一个字符串中的方法,但是与indexOf不同的是,indexOf方法的参数列表是字符char c,而contains方法的参数列表是字符串,不可以用字符类型.

2025-03-15 11:03:44 206

原创 输入两个字符串a和b,字符串内容为二进制数字求两个字符串相加的结果,加法计算方法以二进制方式计算,并返回对应的字符串结果。要求程序尽可能的高效。

这是一道字符串二位制相加的题目,过程是比较繁琐的.其中有很多值得注意的点.hasnextLine以行为单位读入,检测输入流是否有下一行读入.而hasnext检测输入流是否有下一个单词.

2025-03-13 21:53:51 350

原创 返回字符串时遇到的问题

今天在听讲的时候,发现这道题之所以写错,是因为return时直接返回了字符串,而没有调用toString方法.我仔细查了查,字符串可以直接输出,但是不能直接返回.类似的,数组不能直接输出和直接返回.但是字符串可以直接输出。

2025-03-13 19:01:19 95

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除