自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 网页版五子棋项目的问题处理

• 在addHandler 之后,再加上⼀个.addInterceptors(newHttpSessionHandshakeInterceptor()) 代码,这样可以把之前登录过程中往HttpSession中存放的数据(主要是User对象),到WebSocket的session中.⽅便后⾯的代码中获取到当前用户信息。由于handlerMatch 在单独的线程中调⽤.因此要考虑到访问队列的线程安全问题.需要加上锁。• 在玩家连接好的过程中,随时可以通过userId来查询到对应的会话,以便向客户端返回数据。

2025-03-30 21:24:24 262

原创 项目---网页版五子棋

WebSocket是从HTML5开始⽀持的⼀种⽹⻚端和服务端保持⻓连接的消息推送机制理解消息推送:传统的web程序,都是属于"⼀问⼀答"的形式.客户端给服务器发送了⼀个 HTTP 请求, 服务器给客户端返回⼀个HTTP响应.这种情况下,服务器是属于被动的⼀⽅.如果客户端不主动发起请求,服务器就⽆法主动给客户端响应.

2025-03-30 15:55:12 961

原创 追溯初心:记录、分享与交流的动力之源

而当我们回顾自己的历程,追溯最初的初心时,或许会发现,真正的成就感并非来自于获得了多少赞赏和认可,而是来自于通过自己的努力,带来了价值,做出了贡献。这份初心,将继续激励着我们,在创作分享的道路上不断前行。而每一个创作者的背后,都隐藏着一份独特的初心,它如同一颗种子,驱动着他们不断耕耘,最终开花结果。学习是一个持续不断的过程,在这个过程中,我们会阅读大量的书籍、文档、博客文章,观看各种各样的视频教程。日常学习过程中的记录和分享,是一种自我提升和共同进步的有效途径,它能够将个人的学习成果转化为集体的智慧财富。

2025-03-28 21:22:00 398

原创 滑动窗⼝(同向双指针)--- ⽔果成篮

你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类。你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果:你只有 两个 篮子,并且每个篮子只能装 单一类型 的水果。每个篮子能够装的水果总量没有限制。你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果。采摘的水果应当符合篮子中的水果类型。每采摘一次,你将会向右移动到下一棵树,并继续采摘。

2025-03-12 21:17:54 242

原创 滑动窗⼝(同向双指针)---将x减到0的最⼩操作数

给你一个整数数组 nums 和一个整数 x。每一次操作时,你应当移除数组 nums 最左边或最右边的元素,然后从 x 中减去该元素的值。请注意,需要 修改 数组以供接下来的操作使用。如果可以将 x 恰好 减到 0 ,返回 最小操作数;否则,返回 -1。示例 1:输入:nums = [1,1,4,2,3], x = 5输出:2解释:最佳解决方案是移除后两个元素,将 x 减到 0。示例 2:输入:nums = [5,6,7,8,9], x = 4输出:-1。

2025-03-11 19:24:34 306

原创 滑动窗⼝(同向双指针)---最⼤连续1的个数III

给定一个二进制数组 nums 和一个整数 k,假设最多可以翻转 k 个 0 ,则返回执行操作后 数组中连续 1 的最大个数。示例 1:输入:nums = [1,1,1,0,0,0,1,1,1,1,0], K = 2输出:6解释:[1,1,1,0,0,1,1,1,1,1,1]最长的子数组长度为 6。示例 2:输入:nums = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3输出:10。

2025-03-11 18:30:16 534

原创 滑动窗⼝(同向双指针)---⽆重复字符的最⻓⼦串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。示例 1:输入: s = “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: s = “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: s = “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。

2025-03-10 15:04:23 127

原创 滑动窗⼝(同向双指针)---⻓度最⼩的⼦数组

给定一个含有 n 个正整数的数组和一个正整数 target。找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0。示例 1:输入:target = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组 [4,3] 是该条件下的长度最小的子数组。示例 2:输入:target = 4, nums = [1,4,4]输出:1。

2025-03-10 14:03:56 341

原创 双指针---四数之和

题目链接问题分析(易忽略点)代码解决执行用时题目链接给你一个由 n 个整数组成的数组 nums ,和一个目标值 target。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):a、b、c 和 d 互不相同你可以按 任意顺序 返回答案。示例 1:输入:nums = [1,0,-1,0,-2,2], target = 0。

2025-03-05 20:12:00 330

原创 双指针---三数之和

题目链接问题分析代码解决执行用时题目链接给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!= j、i!= k 且 j!= k ,同时还满足 nums[i] + nums[j] + nums[k] == 0。请你返回所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。

2025-03-05 14:07:26 366

原创 双指针---和为s的两个数字

• 对于nums[left] ⽽⾔,此时 nums[right] 相当于是 nums[left] 能碰到的最⼤值(别忘了,这⾥是升序数组哈~)。iii. 当 nums[left] + nums[right] > target 时,同理我们可以舍去nums[right] (最⼩的数都满⾜不了)。• 那对于 nums[right] ⽽⾔,由于此时两数之和是⼩于⽬标值的, nums[right] 还可以选择⽐ nums[left] ⼤的值继续努⼒达到⽬标值,因此 right 指针我们不动;

2024-12-20 22:18:32 336

原创 双指针---有效三角形的个数

题目链接 [有效三角形的个数](https://leetcode.cn/problems/valid-triangle-number/description/)问题分析代码解决执行用时。

2024-12-19 21:57:11 799

原创 双指针---盛最多水的容器

◦ 如果改变右边界,⽆论右边界移动到哪⾥,新的⽔⾯的⾼度⼀定不会超过左边界,也就是不会超过现在的⽔⾯⾼度,但是由于容器的宽度减⼩,因此容器的容积⼀定会变⼩的。当我们不断重复上述过程,每次都可以舍去⼤量不必要的枚举过程,直到 left 与right 相遇。期间产⽣的所有的容积⾥⾯的最⼤值,就是最终答案。如果改变左边界,新的⽔⾯⾼度不确定,但是⼀定不会超过右边的柱⼦⾼度,因此容器的容积可能会增⼤。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。枚举出能构成的所有容器,找出其中容积最⼤的值。

2024-12-18 21:52:37 255

原创 双指针---快乐数

题目链接 [快乐数](https://leetcode.cn/problems/happy-number/description/)问题分析代码解决执行用时。

2024-12-17 20:52:24 682

原创 双指针---复写0

题目链接 [复写0](https://leetcode.cn/problems/duplicate-zeros/description/)问题分析代码解决执行用时。

2024-12-16 21:35:35 711

原创 双指针---移动0

题目链接 [移动0](https://leetcode.cn/problems/move-zeroes/description/)问题分析代码解决。

2024-12-15 22:11:29 349

原创 SpringBoot⼊⻔、Spring Web MVC

Spring Web MVC是基于Servlet API构建的原始Web框架,包含在Spring框架中。通常被称为Spring MVCSpring MVC是⼀个实现了MVC模式的Web框架SpringBoot可以添加很多依赖,借助这些依赖实现不同的功能.SpringBoot通过添加SpringWebMVC框架,来实现web功能.

2024-11-21 21:34:49 1046

原创 ~死锁是什么,如何避免死锁

死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。

2024-10-23 13:48:43 418

原创 ~TCP是如何保证可靠传输的;~三次握手 四次挥手

数据分段:TCP将数据分割成多个段,并为每个段添加TCP头信息,这样可以在传输过程中更有效地管理和控制。序列号:每个TCP段都有一个序列号,接收方通过序列号来重组数据,确保数据按正确的顺序到达。:接收方在成功接收到一个TCP段后,会发送一个确认应答(ACK)给发送方,告知其已成功接收该段。如接收方未收到某个段,则不会发送确认,发送方会在超时后重发未确认的段。:如果发送方未收到确认应答,它会重传丢失的数据段。TCP使用超时重传机制和快速重传机制来保证数据段的可靠性。

2024-10-23 13:36:48 529

原创 ~Java多线程是如何实现数据共享的?Java创建线程池的接口是什么?参数 LinkedBlockingQueue 的作用是什么?Servlet是否是线程安全的?

BLOCKED: 使用 synchronized 的时候, 如果锁被其他线程占用, 就会阻塞等待, 从而进入该状。线程1 能够获取到锁, 并执行方法. 线程2 会阻塞等待, 直到线程1 执行完毕, 释放锁, 线程2 获取到。RUNNABLE: 可工作的. 又可以分成正在工作中和即将开始工作. 调用 start 方法之后, 并正在。NEW: 安排了工作, 还未开始行动. 新创建的线程, 还没有调用 start 方法时处在这个状态.进程和进程之间不共享内存空间. 同一个进程的线程之间共享同一个内存空间.

2024-10-22 18:30:24 708

原创 多线程案例 单例模式--懒汉模式下理解双重 if 判定 / volatile(线程安全);阻塞队列--生产者消费者模型;定时器;线程池

后续的线程, 不必加锁, 直接就通过外层 if (instance == null) 就知道实例已经创建了, 从而不再尝试获取锁了. 降低了开销。加锁 / 解锁是一件开销比较高的事情. 而懒汉模式的线程不安全只是发生在首次创建实例的时候. 因此后续使用的时候, 不必再进行加锁了.定时器也是软件开发中的一个重要组件. 类似于一个 “闹钟”. 达到一个设定的时间之后, 就执行某个指定好的代码。在 Java 标准库中内置了阻塞队列. 如果我们需要在一些程序中使用阻塞队列, 直接使用标准库中的即可.

2024-10-22 18:23:52 1049

原创 多线程带来的的风险--关于线程安全;synchronized 关键字--监视器锁;volatile 关键字;wait 和notify;wait 和 sleep 的对比

如果多线程环境下代码运行的结果是符合我们预期的,即在单线程环境应该的结果,则说这个程序是线程安全的。

2024-09-26 20:38:06 931

原创 ~关于 CAS 机制、ABA问题、偏向锁、synchronized 实现原理、信号量、Callable

偏向锁不是真的加锁, 而只是在锁的对象头中记录一个标记(记录该锁所属的线程). 如果没有其他线程参与竞争锁, 那么就不会真正执行加锁操作, 从而降低程序开销. 一旦真的涉及到其他的线程竞争, 再取消偏向锁状态, 进入轻量级锁状态.Callable 是一个 interface . 相当于把线程封装了一个 “返回值”. 方便借助多线程的方式计算结果.Callable 和 Runnable 相对, 都是描述一个 “任务”. Callable 描述的是带有返回值的任务,

2024-09-25 21:57:57 465

原创 进程和线程的区别;线程的多种创建方式;Thread 类及常见方法;线程的状态

为了让业务更快的办理好,三个人分别负责一个事情,分别申请一个号码进行排队,自此就有了。线程是操作系统中的概念. 操作系统内核实现了线程这样的机制, 并且对用户层提供了一些 API 供用户使。每个客户来银行办理各自的业务,但他们之间的票据肯定是不想让别人知道的,而上面我们的公司业务中虽然是。一家公司要去银行办理业务,既要进行财务转账,又要进行福利发放,还得进行缴社保。不同的执行流,但因为办理的都是一家公司的业务,所以票据是共享着的。RUNNABLE: 可工作的. 又可以分成正在工作中和即将开始工作.

2024-09-25 21:17:47 780

原创 Java的JDBC编程,数据库连接方式区别及Statement和PreparedStatement有什么区别

创建数据库连接Connection创建操作命令Statement使用操作命令来执行SQL// 查询操作(读)// 新增、修改、删除操作(写)处理结果集ResultSet释放资源。

2024-09-20 22:29:04 480

原创 MYSQL常用基本操作总结

SQL查询中各个关键字的执行先后顺序: from > on> join > where > group by > with > having >select > distinct > order by > limit。insert into 表(字段)values(value1),(value2);insert into 表(字段)values(value);select 字段1 别名1, 字段2 别名2 from 表;from 表1,表2 where 条件;from 表1,表1 where 条件;

2024-09-18 16:29:11 1205 1

原创 LinkedList与链表

LinkedList的官方文档LinkedList的底层是双向链表结构,由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,然后通过引用将节点连接起来了,因此在任意位置插入或者删除元素时,不需要搬移元素,效率比较高。

2024-04-27 19:50:03 981

原创 ArrayList与顺序表

ArrayList是以泛型方式实现的,使用时必须要先实例化ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问ArrayList实现了Cloneable接口,表明ArrayList是可以clone的ArrayList实现了Serializable接口,表明ArrayList是支持序列化的和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者CopyOnWriteArrayList。

2024-04-26 19:35:44 1264 1

原创 初步认识泛型

通俗讲就是:返回的Object数组里面,可能存放的是任何的数据类型,可能是String,可能是Person,运行的时候,直接转给Integer类型的数组,编译器认为是不安全的。这个问题,也是曾经的一个面试问题。在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。在编译的过程当中,将所有的T替换为Object这种机制,称为:擦除机制。通过命令:javap -c 查看字节码文件,所有的T都是Object。方法限定符 <类型形参列表> 返回值类型 方法名称(形参列表) {

2024-04-25 19:54:26 736 1

原创 包装类&简单认识泛型

一般的类和方法,只能使用具体的类型:要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大。----- 《Java编程思想》对泛型的介绍。泛型是在JDK1.5引入的新的语法,通俗讲,泛型:就是适用于许多许多类型。从代码上讲,就是对类型实现了参数化。

2024-04-24 20:09:22 848 1

原创 List的介绍

在集合框架中,List是一个接口,继承自Collection。List的官方文档站在数据结构的角度来看,List就是一个线性表,即n个具有相同类型元素的有限序列,在该序列上可以执行增删改查以及变量等操作。List中提供好的方法,具体如下(常见):注意:List是个接口,并不能直接用来实例化。如果要使用,必须去实例化List的实现类。在集合框架中,ArrayList和LinkedList都实现了List接口。

2024-04-24 19:30:49 234

原创 时间和空间复杂度

算法效率分析分为两种:第一种是效率,第二种是效率。时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是随着计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以如今已经不需要再特别关注一个算法的空间复杂度。

2024-04-22 18:00:04 762 2

原创 顺序表和链表

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。上非连续存储结构,数据元素的逻辑顺序是通过链表中的。静态顺序表适用于确定知道需要存多少数据的场景.中间或前面部分的插入删除时间复杂度O(N)动态顺序表:使用动态开辟的数组存储。任意位置插入删除时间复杂度为O(1)没有增容问题,插入一个开辟一个空间。以节点为单位存储,不支持随机访问。静态顺序表:使用定长数组存储。空间连续、支持随机访问。

2024-04-21 20:12:34 703 1

原创 集合框架及背后的数据结构

官方教程。

2024-04-21 19:47:13 537 1

原创 String类oj

【代码】String类oj。

2024-04-14 20:40:16 326 1

原创 String类

在C语言中已经涉及到字符串,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面向对象的思想,而字符串应用又非常广泛,因此Java语言专门提供了String类。字符串转整形数字字符串相加而且在面试中也频繁被问到(String、StringBuff和StringBulider之间的区别等)。

2024-04-13 20:56:56 1431

原创 图书管理系统

基于类和对象、继承和多态、抽象类和接口相关内容,完成此小项目。

2024-04-11 20:04:47 1297 1

原创 抽象类和接口(补充)

注意事项: 对于方法来说, 需要传入的数组的每个对象都是 “可比较” 的, 需要具备 compareTo 这样的能力. 通过重写 compareTo 方法的方式, 就可以定义比较规则.核心区别: 抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中不能包含普通方法, 子类必须重写所有的抽象方法.Object 类中存在一个 clone 方法, 调用这个方法可以创建一个对象的 “拷贝”.Java 中内置了一些很有用的接口, Clonable 就是其中之一.

2024-04-09 18:07:36 645 1

原创 抽象类和接口

/ 矩形类System.out.println("矩形: length= "+length+" width= " + width);// 圆类:this.r = r;System.out.println("圆:r = "+r);

2024-04-08 19:37:16 761 1

原创 Java多态

重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程进行重新编写,访问权限不能比父类中被重写的方法的访问权限更低。向下转型用的比较少,而且不安全,万一转换失败,运行时就会抛异常。子类在重写父类的方法时,一般必须与父类方法原型一致: 返回值类型 方法名 (参数列表) 要完全一致。即:方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法。向上转型的缺陷:不能调用到子类特有的方法。

2024-04-02 12:20:18 1323 1

空空如也

空空如也

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

TA关注的人

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