自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MYDB 之九 | TableManager (TBM) 字段解析与表管理

而记录本身的结构, 将由TBM来维护, TBM维护记录的方式非常简单: 直接将记录的值, 转换成二进制的字节数组, 然后将该字节数组, 当做数据, 交给VM进行存储和管理. 之后, 当需要某条数据时, 则通过其地址, 从VM将其读出, 然后反解析出其值.NYADB会对上述的文法进行解析, 解析的方法也很简单: 首先将语句给token化, 然后之后就是if-else的方法进行判断和进行语句组装了. token化的方法也很简单, 分析出文法的词素, 然后写一个小自动机, 不断的切分就行了.

2024-07-21 21:29:51 569

原创 MYDB 之十 | 客户端与服务端

若 flag 为 0,表示发送的是数据,那么 data 即为这份数据本身;如果 flag 为 1,表示发送的是错误,data 是 Exception.getMessage() 的错误提示信息。客户端连接服务器的过程,实际上只是读入用户的输入,并调用 Client.execute()。是一个服务器类,主要作用是监听指定的端口号,接受客户端的连接请求,并为每个连接请求创建一个新的线程来处理;数据,这样可以避免特殊字符造成的问题,并在信息末尾加上换行符。这个类是服务器的启动入口,这个类解析了命令行参数。

2024-07-21 16:12:48 351

原创 技术派Spring事件监听机制及原理

这篇内容通过源码的形式讲解了 Spring 事件监听机制及其原理。

2024-07-01 22:28:05 1002 1

原创 技术派全局异常处理

全局的异常处理是Java后端不可或缺的一部分,可以提高代码的健壮性和可维护性。在我们的开发中,总是难免会碰到一些未经处理的异常,假如没有做全局异常处理,那么我们返回给用户的信息应该是不友好的,很抽象的,用户会认为我们的程序是不安全的。相反,如果有了全局异常处理,那么我们就可以给用户提供更友好的反馈。

2024-07-01 22:21:01 1073

原创 xxl-job实现定时任务

下面先放一张我从官网找的的最新的架构图,是v2.1.0版本的,不是代码最新的架构图但是几乎大差不差,右下角红框标出来的自研 RPC(xxl-rpc),在 V2.2.0 里面已经替换成了restful风格的 http 请求方式。4、xxl-job-executor-samples:执行器,sample 示例项目,其中的 spring boot 工程,可以直接启动。3、xxl-job-admin:调度中心,项目源码,spring boot 项目,可以直接启动。2、xxl-job-core:公共 Jar 依赖。

2024-06-26 22:37:44 554

原创 021.合并两个有序链表,递归和遍历

这道题目是链表的基础题,递归和迭代都可以解决,递归的思路更加简洁,但是对于新手来说,理解起来可能会有些困难,迭代的思路更加直接,但是代码量会多一些。关键还是理解链表的数据结构,这个视频讲的不错,推荐一手。链表 数据结构与算法,完整代码动画版,附在线数据结构交互式工具_哔哩哔哩_bilibili还有这个网站,对链表也进行了详细的讲解,推荐一手。4.2 链表 - Hello 算法。

2024-06-26 22:31:36 639

原创 024.两两交换链表中的节点,用递归和 while 循环

其实有关链表的相关题目,最重要的切入角度,就是理清楚节点之间的关系,然后在纸上画一画,不要一个劲的只靠脑子不靠笔,往往思考了很久的问题,动动笔,就会豁然开朗,再用代码准确的描述出思路,这样子链表的问题便迎刃而解。那这道题考察的还是链表的数据结构,以及递归和 while 循环的一些临时变量和边界条件。. - 力扣(LeetCode)

2024-06-24 20:54:25 563

原创 UDP就一定比TCP快吗?

有时候处理的快些,那就可以收多点数据,处理的慢点那就希望对方能少发点数据。如果想要通过这个 socket 发消息,只需要操作这个 fd 就行了,比如执行 send(fd, msg, ...),内核就会通过这个 fd 句柄找到 socket 然后进行发数据的操作。因为数据发送方和接收方处理数据能力可能不同,因此如果可以根据双方的能力去调整发送的数据量就好了,于是就有了。,此时对方执行接收消息的操作,也就是 recv(fd, msg, ...),就能拿到你发的消息。UDP 表示,"哦,是吗?

2024-06-17 23:59:47 584

原创 第 34 题:在排序数组中查找元素的第一个和最后一个位置

只要遇到要求时间复杂度为 O(log n),那都是要使用二分查找法的,大家一定要学好二分查找。其基本思想就是通过将查找范围每次缩小一半,从而快速定位到目标值。第一步,初始化左右边界 left 和 right。第二步,计算中间位置 mid。如果相等,返回 mid。如果小于目标值,更新 left 为 mid + 1。如果大于目标值,更新 right 为 mid - 1。第四步,重复上述步骤,直到 left 大于 right。return mid;} else {

2024-06-17 22:48:05 803

原创 035.搜索插入位置

这道题仍然考察的是二分查找法,由此可见二分查找法的重要性。去 B站搜了一下,这个 up 讲的不错,推荐大家看一下。数据结构合集 - 折半查找(二分查找). - 力扣(LeetCode)

2024-06-16 11:41:16 990

原创 第五章.日期类

1.概述:日历类,是一个抽象类2.获取:static Calendar getInstance()3.月份问题:国外: 0 1 2 3 4 5 6 7 8 9 10 11国内: 1 2 3 4 5 6 7 8 9 10 11 121.概述:DateFormat是一个抽象类使用其子类:SimpleDateFormat2.作用:可以按照指定的格式将日期格式化3.创建:SimpleDateFormat(String pattern)pattern:指定的格式yyyy-MM-dd HH:mm:ss ->

2024-06-16 10:22:05 643

原创 第二章.数字相关类

1、概述:Math是一个数学工具类2.作用:主要用于数学运算a.构造私有化,不能new对象b.方法都是静态的4.使用: 类名直接调用1.概述:将来我们操作的整数,有可能非常大,大到比long型还要大,这种整数应该称之为"对象",我们需要用 BigInteger来接收超大整数2.作用: 处理超大整数注意:1、我们不能直接用double和float类型的数据直接参与运算,因为有可能会出现精度损失问题2.解决:我们可以用BigDecimal来解决。

2024-06-12 22:32:13 384

原创 第一章.StringBuilder类

1.概述:一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证线程同步2.作用:主要作用是拼接字符串3.明明String可以做字符串拼接,那为啥还要学StringBuilder?a.String做拼接的时候,会产生新的字符串对象,如果要是频繁用String拼接,会出现很多新的字符串对 象,占用内存b.StringBuilder底层自带缓冲区,我们拼接的字符串都会出现在缓冲区中,不会每次拼接不会随意产生新 字符串对象,效率高,省内存。

2024-06-11 22:24:04 438

原创 033.搜索旋转排序数组

遇到 O(log n) 的题目,首先想到的就是二分查找,这道题也是一样,只不过在二分查找的基础上,增加了一些判断条件。而二分查找的关键是找到有序的部分。. - 力扣(LeetCode)

2024-06-07 21:56:25 776

原创 020.有效的括号,用栈来解决的 Java 版 LeetCode 刷题笔记

本次我们利用了栈这个数据结构来解决了括号匹配问题,实际上,栈还能解决更多问题,如表达式的转换、求值,而且通过保持栈内元素的单调性,还可以离线解决 RMQ 问题(问题,即区间最值问题)。. - 力扣(LeetCode)

2024-05-30 22:18:03 876

原创 032.最长有效括号

这道题依然考察的是栈这个数据结构,只不过是在有效括号的基础上,增加了一个长度的计算,所以我们只需要在遍历的过程中,不断更新最长有效括号的长度即可。当然了,Java 已经不再推荐使用 Stack 这个类,而是使用 Deque 接口的实现类 ArrayDeque,因为 Stack 继承了 Vector,而 Vector 是线程安全的,所以 Stack 的所有方法都是同步的,性能较差。

2024-05-30 21:04:36 767

原创 012整数转罗马数字

本题的关键是通过整数转罗马数字的表象,找出贪心算法的本质。这种找本质的能力,其实是需要大量的练习才能掌握的。比如说,还是找零的问题,面值不再是 1 元、2 元、5 元、10 元、20 元、50 元、100 元,而是 1 元、3 元、4 元,要你找零 6 元。如果是贪心算法,结果会是 1 张 1 元,2 张 1 元。但更优的选择应该是 2 张 3 元,对吧?贪心算法的局限性就在于它总是寻求局部最优解,而不一定能得到全局最优解。

2024-05-29 21:30:21 836

原创 058.最后一个单词的长度

这题如果直接正向去求解,往往会纠结于这个单词是不是最后一个单词,就需要复杂的判断条件,而且也会有一些冗余的比较,可能时间复杂度和反向求解是一样的,但实际运行的时候,会明显地感觉到效率很低。注意到题目的字符串只有空格和字母,所求又是最后一个单词的长度,那么我们只需要过滤掉字符串末尾的空格,然后从后往前数,看有多少个连续的非空的字符即可。解释:最后一个单词是长度为6的“joyboy”。解释:最后一个单词是“World”,长度为5。解释:最后一个单词是“moon”,长度为4。

2024-05-29 21:26:04 499

原创 012整数转罗马数字

本题的关键是通过整数转罗马数字的表象,找出贪心算法的本质。这种找本质的能力,其实是需要大量的练习才能掌握的。比如说,还是找零的问题,面值不再是 1 元、2 元、5 元、10 元、20 元、50 元、100 元,而是 1 元、3 元、4 元,要你找零 6 元。如果是贪心算法,结果会是 1 张 1 元,2 张 1 元。但更优的选择应该是 2 张 3 元,对吧?贪心算法的局限性就在于它总是寻求局部最优解,而不一定能得到全局最优解。

2024-05-21 20:54:41 540

原创 MYDB运行环境的搭建

以上为拿到该项目做的第一件事情,源地址我已经放在下面啦,本着学习的心态输出一些内容,检测监督自己学习。MYDB。

2024-05-14 11:18:22 685

原创 031.下一个排列Java实现

观察nums = [1,3,4,2] -> nums = [1,4,2,3]这一步,因为4比3大,且4的位置在3之后,所以将4与3交换,必然能够使得nums变大,交换了之后,则变成了nums = [1,4,3,2]。但显然这不是最小的比nums = [1,3,4,2]大的一个排列,我们还要把3和2的位置再翻转一下,才能得到nums = [1,4,2,3]这个。例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1]。

2024-05-11 21:08:55 656

原创 028.实现 strStr()

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1。简单输入:haystack = "sadbutsad", needle = "sad"输出:0解释:"sad" 在下标 0 和 6 处匹配。第一个匹配项的下标是 0 ,所以返回 0。输入:haystack = "leetcode", needle = "leeto"

2024-05-11 21:06:25 772

原创 网页使用之如何返回json/xml

后端返回json数据给前端进行渲染的方式比较熟悉,至于返回html页面,返回xml的方式接触逐渐减少,来在项目中熟悉这一点。

2024-04-25 21:50:47 1061

原创 请求参数解析

请求参数想必是很熟悉的,不过还是有许多的需要注意的。以下问题是否注意过?下面结合项目详解一下。如ReqRecordFilter中就对请求参数进行了解析,输出到req-log中。再比如 BodyReaderHttpServletRequestWrapper会对请求参数的流进行封装,避免请求因为i日志的打印提前消耗掉。下面,从get请求参数解析说起。

2024-04-22 22:12:55 877

原创 删除有序数组中的重复项

输入:nums = [1,1,2] 输出:2, nums = [1,2] 解释:返回新数组的长度 2,并且原数组 nums 的前两个元素被修改为 1, 2。输入:nums = [0,0,1,1,1,2,2,3,3,4] 输出:5, nums = [0,1,2,3,4] 解释:方法应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。

2024-04-09 13:33:39 598

原创 移除元素Java实现

遍历结束后,j 的位置就是新数组的长度,因为它指向了第一个“空闲”的位置,也就是第一个没有被复制过的元素的位置。例如,方法返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。Java 并不存在引用传递,只有值传递,数组是一种特殊的对象,传递的是对象在堆中的地址,所以在方法中修改数组的内容是会影响到调用者的。输入:nums = [0,1,2,2,3,0,4,2], val = 2。输入:nums = [3,2,2,3], val = 3。

2024-04-09 11:26:47 464

原创 019删除链表的倒数第 N 个节点

引入虚拟头节点后,删除头节点和其他节点的操作可以统一处理,因为头节点也会有一个前节点(即虚拟头节点)。找到节点后,将节点的前一个节点的 next 指向节点的下一个节点;将节点的下一个节点的 prev 指向节点的前一个节点,这样就将节点从链表中删除了。为了方便删除节点,我们需要一个虚拟节点,让虚拟节点的 next 指向 head,这样就能保证删除节点的前一个节点不为空。倒数第 4 个节点的前一个节点就是 5-4=1,也就是第一个节点。第一步,遍历链表,找出链表的长度,确定要删除的节点的位置。

2024-04-08 16:57:08 842

原创 Spring Boot 整合 RabbitMQ 实现延迟消息

Fanout模式不需要处理路由键(所以我们在 sendBroadcast 接口中,convertAndSend 方法中传递的 routingKey 是空的),我们只需要简单的将队列绑定到exchange上,发送到exchange的每一个消息都会被转发到与该exchange绑定的所有队列上。因为 TCP 连接是比较昂贵的,新建需要三次握手,销毁需要四次挥手,所以如果每个线程在想 RabbitMQ 服务端发送/接收消息的时候都新建一个 TCP 连接,就会非常的消耗资源,于是就有了信道。消息包括消息体和标签。

2024-04-04 15:28:59 1296

原创 29题:Java实现两数相除

题目要求不能用除法,不过我们处理溢出情况的写法,后面还是要用到的,尤其是 (long) dividend 这个强转的处理,其实就考察了基本数据类型的转换问题,包括最后返回的 (int) result,都是很细节的问题,但却很重要。很遗憾,前 5 个测试用例都是可以顺利通过的,但最后 1 个测试用例耗时会特别长,因为要计算 2147483648 / 1次,这个数太大了,所以我们要想办法优化一下。在数学中,加法是加减乘除的基础,减法是加法的逆运算,乘法是加法的倍增,除法是乘法的逆运算。

2024-04-04 13:58:26 1631

原创 Spring Boot 整合 OSS 实现文件上传

OSS 也就是 Object Storage Service,是阿里云提供的一套对象存储服务,国内的竞品还有七牛云的 Kodo和腾讯云的COS。第六步,打开 Apipost,测试 OSS 上传接口,注意参数选择文件,点击发送后可以看到服务器端返回的图片链接。第二步,如果是 OSS 新用户的话,可以享受 6 个月的新人专享优惠价,不过续费的时候还是会肉疼。第三步,进入 OSS 管理控制台,点击「Bucket 列表」,点击「创建 Bucket」。第一步,在 pom.xml 文件中添加 OSS 的依赖。

2024-04-04 13:46:29 505

原创 最接近的三数之和

另外一个点是移动左指针还是右指针,当 sum 大于 target,说明 sum 太大了,需要减小 sum,那么就移动右指针,反之,如果 sum 小于 target,说明 sum 太小了,需要增大 sum,那么就移动左指针。那刷题其实就是这样,学会举一反三,遇到不同的题型,尽量去找到和它相似的题型,能不能按照之前的解题思路快速把这道题解出来,解出来后再想办法去优化。当输入是 nums = [-1,2,1,-4], target = 1 的时候,就需要移动左指针,因为 sum 太小了,需要增大 sum。

2024-04-01 16:48:58 895

原创 实现三数之和

对于题解 1 来说,很好掌握,因为有两数之和的基础,但效率不高。对于题解 2 来说,边界条件有点多,比如说第一层 for 循环要以。

2024-03-31 16:53:20 855

原创 Javase百问白答系列一

设计目的和思想:抽象类用于创建类继承层次结构,将具有相似行为和属性的类进行分组,并提 供默认实现。接口用于定义合同或规范,强调类应该具有什么行为而不是如何实现,不相关的类可以实 现相同的行为。类成员通常用来表示整个类的共享信息,实例成员则用于表示每个实例的个性化信息。实例成员被定义在类的内部,但在实例方法内部。它们与类的实例相关联,只有在创建类的实例时。实例成员在类的实例化过程中创建,实例被销毁时,实例成员也会被销毁。实例成员在每个类的实例化过程中会为每个实例分配独立的内存空间。

2024-03-30 22:07:22 645

原创 Spring Boot整合MyBatis-Plus,并通过AutoGenerator生成项目骨架代码

作为一名 Java 后端开发,日常工作中免不了要生成数据库表对应的持久化对象 PO,操作数据库的接口 DAO,以及 CRUD 的 XML,也就是 mapper。Mybatis Generator 是 MyBatis 官方提供的一个代码生成工具,完全可以胜任这个工作,不过最近在开发项目的时候试用了一下 MyBatis-Plus 官方提供 AutoGenerator,发现配置更简单,开发效率更高!

2024-03-29 18:54:35 1342

原创 整合SpringSecurity+JWT实现登录认证

这个类的主要作用就是告诉 SpringSecurity 那些路径不需要拦截,除此之外的,都要进行 RestfulAccessDeniedHandler(登录校验)、RestAuthenticationEntryPoint(权限校验)和 JwtAuthenticationTokenFilter(JWT 过滤)。第二步,在需要登录认证的模块里添加 CodingmoreSecurityConfig 类,继承自 codingmore-security 模块中的 SecurityConfig 类。

2024-03-28 19:03:34 1600

原创 Spring Boot 使用过滤器、拦截器、监听器

作用过滤器(Filter):当有一堆请求,只希望符合预期的请求进来。拦截器(Interceptor):想要干涉预期的请求。监听器(Listener):想要监听这些请求具体做了什么。区别过滤器是在请求进入容器后,但还没有进入 Servlet 之前进行预处理的。如下图所示。拦截器是在请求进入控制器(Controller) 之前进行预处理的。

2024-03-27 19:01:21 1303 1

原创 SpringBoot中处理校验逻辑的两种方式:Hibernate Validator+全局异常处理

实际开发中把两者结合在一起用,就可以弥补彼此的短板了,简单校验用 Hibernate Validator,复杂一点的逻辑校验,比如说需要数据库。

2024-03-27 17:49:58 873

原创 Spring Boot 整合 MyBatis

从整体上来讲,MyBatis 可以分为三层。接口层:SqlSession 是我们平时与 MyBatis 完成交互的核心接口;核心层:SqlSession 执行的方法,底层需要经过配置文件的解析、SQL 解析,以及执行 SQL 时的参数映射、SQL 执行、结果集映射等;支持层:核心层的功能实现,是基于底层的各个模块,共同协调完成的。

2024-03-26 16:42:15 1887

原创 MySQL WHERE 条件查询

所以,% 通配符可以连续出现,但是它们的含义是一样的,都是匹配任意长度的字符序列。不过,还是以出现在模式的两端最常见。这一节,我们学习了一些简单的 WHERE 条件查询,包括比较查询操作符、区间查询、枚举查询、NULL 查询、逻辑操作符、通配符查询等。文件中进行 SQL 语句的定义和拼接,比如说技术派的 admin 端在查询文章的时候,就是通过自定义 SQL 来实现模糊查询的。其中重点讲了 % 通配符的使用,包括 MyBatis 中的 # 和 $ 的区别,以及 MySQL 会如何处理连续的 % 通配符。

2024-03-26 16:42:05 1117

原创 MySQL 之简单查询

在日常的开发工作中,查询语句也是最常用的,因为表在一开始设计的时候已经确定了,后期很少去修改表结构,也就意味着插入数据的方式也是确定的,但数据的展示方式却千奇百怪,用户端和 admin 管理端可能需要各种各样的数据,那 MySQL 就要提供最接近需求的数据,这样可以节省 Java 程序对数据的转换处理,也就相应提升了程序的性能。当然了,并不建议使用 * 通配符,因为这样会导致查询出来的字段过多,而且不利于程序的性能优化,尽量按需查询字段,就是当前需要什么字段就查询什么字段,不够用的话,再添加字段。

2024-03-24 14:55:29 602

空空如也

空空如也

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

TA关注的人

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