自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 聊天室系统原理

其中,当获取到 String type = r.getParameter("type")以后,如果在这里去处理不同消息的类型,是不合适的,假设需要做一个群发客户端的功能,在线量很大的情况下需要发送大量消息,这个操作会非常耗时,而在消息发送期间,如果又下一条消息过来,服务器线程就读不到了。其次再有一个客户端类,用于获取包括发送消息的类型,发送者,接收者等,通过Request对象设置parameters的参数,在通过socket对象把消息发出去。// 客户端在创建Request对象的时候,

2023-10-02 15:33:26 242

原创 多线程之生产者消费者

System.out.println("消费者 "+name+"取出商品,池子里剩余奖品数量: "+size);System.out.println("生产者 "+name+"放入商品,池子里剩余奖品数量: "+size);目的是回顾多线程的几个api。多生产者+多消费者+共享池。

2023-10-01 21:23:01 202

原创 模板方法模式在JDBCTemplate中的应用

回调接口和模板方法类之间的关系可以看作服务与被服务的关系,模板方法类想要回调接口做事,就要提供相应的资源,接口用提供的资源做事,完事后,模板方法类来处理公开的资源,回调接口不需要在关心这些。此时当调用者调用update方法时,迫使实现PreparedStatementCreater 接口中的createPreparedStatement方法。此时多条数据映射一个部门对象,根据查询结果集逐条映射的逻辑是不对的,因此查询方法也要进行改造,同样是通过的传入接口迫使调用者实现剩余逻辑的方法来做。

2023-08-21 02:59:57 632

原创 设计模式之模板方法模式

不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。Collections调用sort方法时就可以实现排序的功能,如果要改变比较的方式,只需要修改比较方法中的代码,从而达到排序方式改变的目的,而sort()方法中的代码基本固定,不需要做修改,这就是一处典型模板方法模式的应用。模板方法模式主要用于对算法或行为逻辑进行封装,即如果多个类中存在某些相似的算法逻辑或者行为逻辑,可以将这些相似的逻辑提取到模板方法类中实现,然后让相应的子类根据需要实现某些自定义的逻辑。

2023-08-15 00:42:16 1288

原创 java实现多级菜单

return setResultSuccess("信息查询成功", menuTree);// 将菜单按照父菜单ID分组,放在menuMap中。* 根据父菜单节点逐级构建子树,按顺序排列。// 从根菜单开始,构建菜单树。//获取根菜单的子节点列表。

2023-08-05 00:14:53 1231

原创 编辑列表操作时的一些思考,关于全量和增量操作

如果用户角色关系表数据量较大,或者编辑后的角色列表和原有角色列表的差异较大,可能会导致大量的删除和插入操作,影响性能,此时可以考虑采用第二种方式,全量更新。在数据量较大或性能要求较高的情况下,增量更新通常是更优的选择。角色下面有一些菜单项,通过一张角色-菜单关系表来维护,那么我要在编辑用户后也要对用户角色关系表做修改,是经过两次比较分别计算出需要增加或者删除的角色用户关系,还是直接把原来的用户角色关系删除后重新添加呢?删除操作会导致索引的失效,插入操作会导致索引的重建,这些操作都需要额外的计算和存储资源。

2023-08-03 08:43:43 257

原创 MyBatis动态sql传参的问题

其中 STATUS是一个Integer型枚举值(0,1),问题就是当从前端传进来的参数status为1时能被mybatis解析,而当status为0时这个判断条件直接被忽略了。,而不是作为真正的值传递。这是因为在XML配置文件中,属性实际上是一个Ognl表达式,而Ognl表达式中的。-- 使用动态SQL进行条件判断 -->处理,即 ‘’ == 0 == false.原因是在MyBatis中,会将。,都能被正确传入作为参数。

2023-08-02 23:33:41 209

原创 记录long类型传参时异常org.springframework.http.converter.HttpMessageNotReadableException

请注意,JSON规范不允许数字以0开头,因为0开头的数字在JSON中被解释为八进制数。如果你需要传递一个整数值,而该值以0开头,你可以将其转换为字符串,以避免JSON解析错误。例如,将整数值123转换为字符串"123",以便正确地在JSON中传递。要解决这个问题,您可以确保在JSON数据中传递的数字字符串不以0开头,或者修改后端代码来处理以0开头的数字字符串。这个异常是因为在JSON数据中传递了一个数字字符串,但该数字字符串以0开头,而JSON中数字不能以0开头。

2023-08-01 12:46:13 567

原创 记录一个异常

这行代码,由于返回的列表为空(size为0),访问索引为0的元素就会触。

2023-07-29 00:59:30 48

原创 记录Mybatis中插入数据返回主键id的配置

如果使用的是 Oracle 数据库,你可以通过序列(Sequence)来模拟自增主键的功能。首先,你需要在数据库中创建一个序列,然后在插入数据时使用该序列的下一个值作为主键。来插入数据后,可以从插入的对象中(插入前没有id值)来获取自动生成的主键ID。这是因为MyBatis会自动将生成的主键ID设置到对象的。后,如果数据库中的主键是自动生成的(比如自增长字段),MyBatis会将生成的主键ID回填到。这样就能在插入数据时获得正确的主键值,而无需使用数据库的自增功能。的序列,从 1 开始,每次递增 1。

2023-07-29 00:54:29 735

原创 记录ORACLE模糊查询的一个错误

ORA-00909是一个SQL语法错误,错误信息指示参数个数无效。函数来拼接字符串,而该函数只接受两个参数,但你传递了三个参数。

2023-07-27 23:33:28 150

原创 日期类的存储

类型转换为数据库的TIMESTAMP类型。确保在Java中设置好正确格式的日期,这样就能正确地插入到数据库中。需求:将类中的Date以YYYY-MM-DD HH:mm:ss格式插入到数据库。类型属性的数据是按照"YYYY-MM-DD HH:mm:ss"格式设置的。,确保正确地将Java中的日期转换为数据库的TIMESTAMP类型。(如果是使用Spring框架的话)来控制日期的格式化和解析。在Mapper XML文件中,使用MyBatis的。在这个例子中,我们使用了。在Java类中,确保。

2023-07-27 23:29:01 347

原创 一文讲清 VO、DTO、ENTITY、PO

通常情况下,DTO对象传递到Service层后,如果Service层需要进一步处理数据或进行业务逻辑,可能会在Service层内部将DTO对象转换为VO(View Object)对象,然后再传递给表示层(页面)。同时,DTO对象和VO对象的设计也需要根据实际业务场景和需求来灵活选择,不是必须的,在一些简单的场景中,DTO和VO可以是相同的对象。1. DTO对象:主要用于数据传输和服务层之间的数据交互,它通常是根据数据表或数据库的结构来设计的,包含了数据库字段的信息。

2023-07-21 00:52:16 2756

原创 (六)贪心

两个if判断逻辑错误,顺序应该调整,如果第j个加油站的油比i便宜,但一箱油开不过去也是不可以的。贪心法:在每一步都选局部最优,问题的整体最优解可以通过一系列局部最优选择而得到。i虽然在N处结束循环,但不需要i++去影响,应该换成while(i<=N)贪心:找下一个更便宜(不是最便宜)的加油站 j,油两种情况在j停车加油。1.第j个油站比当前价格低,在第j站停下,此时在i站只加够开到j的油。2.油不够开到第j+1站,在第j站停下,在i站加满。优点:复杂度常常是O(1)的。

2023-03-31 22:54:47 52

原创 (八)简单数论

由a=11和a=17可知,该数是11和17的公倍数,但题目给定范围是10^17,步长为11*17去递增模拟还是太慢,需要找到一个较大的步长K,满足后面5个数(a=45,46,47,48,49)的n,从小到大的n1,n2,n3,…,它们是一个新的等差数列,可以令k=n3-n2=n2-n1,作为for循环的步长。中找,有5,11,17…同理,继续满足第三个条件,从上一步的5,11,17…找,此时步长k=lcm(2,3,4),从表格的第一个条件开始,除以2余1的数有3,5,7,9…常用两种方法:埃氏筛,欧拉筛。

2023-03-28 09:13:39 143

原创 (五)二分法

1e-7表示10^-7,也可以用for循环来写,直接100次二分,一定会分到一个极小区间,但这个100不能滥用,达到精度即可,否则会超时。如函数在区间[1,10000]内单调,要求根的精度10^-8,那么由10000/2^n

2023-03-22 16:32:22 2098

原创 (四)搜索

把空盘看成 0,那么一个圆圈上有 9 个数字 {0,1,2,3,4,5,6,7,8},拉直成了一条线上的 9 个数字,这条线的首尾两个数字处理成相连的。另外,如果不去重需要跳4^20次,因此需要做去重,如果跳到曾经出现过的状态,就不再继续搜索,一共有9!如果反过来看,让空盘跳,跳到蚱蜢的位置,就简单多了,只有一个空盘在跳。DFS连通性判断:图论的一个简单问题,给定一张图,图由点和连接点的边组成,找到图中互相连通的部分。用队列实现,从起点出发,按层次从近到远,逐层先后搜索,先搜到的层离起点更近。

2023-03-20 13:17:00 68

原创 (三)递归与递推

所以,我们可以根据要找的格雷码,找到其在上面一层中的“父亲”,利用递归法可以找到每个格雷码形成的路径,在回溯的过程中,修改字符串str就可以还原出n位中的第k号格雷码。以三位格雷码为例,前4个是由第0~3个两位格雷码在前面加0,后4个是由第3~0个两位格雷码在前面加1得到。本题也是一道组合算法题,000~111三位数,相当于是从3个里面随机抽取,0表示没选取,1表示选取,那么它应该是上一排中的(2 ^ n)- 1 - k号格雷码前面加“1”变成的;那么它应该是n-1位中的k号格雷码前面加“0”变成的;

2023-03-11 19:56:27 167

原创 (二)枚举与尺取

java中没有C++STL中的next_permutation方法,手动实现全排列的代码,有些情况下要用到。只含因子3 5 7,即3^i*5^j*7^k,尺取法即双指针法,有同向和反向两种扫描方式。从{1,2,3,4}中选3个的排列,接替过程如下,但运行结果显示超时。本题用同向扫描,滑动窗口法。手写排列代码(暴力法)手写排列代码(暴力法)

2023-03-06 16:29:08 230

原创 (一)杂题—简单计算与模拟

本题求的是如何付款使方差最小,方差意味着一组数据的平稳程度,直接思路是这n个人,如果带的钱不够平均数,需要把钱全部付掉,那后一部分人,如何付款让方差最小?题目规定n≤5×10^5,0≤ai≤10^9 ,2的10次幂约等于10的3次幂,2的32次幂约等于10的9次幂所以用int定义n,long定义存放ai的数组a,剩下那部分带钱多的,不管怎么摊他都有富余,所以对于这部分人,付款数是剩余付款数平摊。前一部分人带的钱不够,需要从总付款数S中扣掉他们的钱,得到剩余付款数S',其中有几个细节提一下,

2023-02-28 16:27:07 95

原创 理论基础 |77.组合

顺带回顾几个语法基础,因为我们要用到removeLast()移除list最后一个元素,所以path定义LinkedList path = new LinkedList();回溯法解决的问题都可以抽象为树形结构(N叉树),用树形结构来理解回溯就容易多了。图中可以发现n相当于树的宽度,k相当于树的深度。子集问题:一个N个数的集合里有多少符合条件的子集。排列问题:N个数按一定规则全排列,有几种排列方式。组合问题:N个数里面按一定规则找出k个数的集合。和之前的递归的逻辑其实是一样的。

2023-02-24 11:05:02 46

原创 算法第十六天| 513.找树左下角的值|112. 路径总和 113.路径总和ii|106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树

513.找树左下角的值。

2023-02-16 18:20:59 60

原创 算法第十五天|110.平衡二叉树 |257. 二叉树的所有路径 |404.左叶子之和

110.平衡二叉树。

2023-02-11 02:12:18 82

原创 算法第十四天|104.二叉树的最大深度|559.n叉树的最大深度|111.二叉树的最小深度|222.完全二叉树的节点个数

问题所在:如果根节点root的左右子节点有一个为null,程序就会把0+1当成最短路径。而最小深度是从根节点到最近。因此应该对程序做修改。左叶子节点为null,去返回右边的深度;右叶子节点为null,返回左边深度。本题使用后续遍历的方式代码更为简洁,最初写了一版又问题的代码。的最短路径上的节点数量。这是不符合最小深度的要求的,222.完全二叉树的节点个数。559.n叉树的最大深度。111.二叉树的最小深度。用普通二叉树遍历的方法。

2023-01-30 17:58:46 71

原创 算法第十三天|层序遍历 |226.翻转二叉树 |101. 对称二叉树

看完题解后自己实现了一遍,利用递归法,分别比较外侧和内测的节点是否对称。第一次学习bfs思想(利用队列),看完题解后自己实现了一遍。和上一题的区别是需要把最后层序遍历后的结果res做一次翻转。107.二叉树的层次遍历II。102.二叉树的层序遍历。101. 对称二叉树。

2023-01-23 14:45:42 87

原创 算法第十二天|基础理论|144.二叉树的前序遍历|145.二叉树的后序遍历|94.二叉树的中序遍历

除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。又被称为AVL(Adelson-Velsky and Landis)树,左子树和右子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。节点有顺序,左子树所有节点都小于中间节点,右子树所有节点都大于中间节点。广度优先搜索:一层一层或一圈一圈的去遍历,如层序遍历(迭代法)94.二叉树的中序遍历。

2023-01-15 01:07:12 50

原创 算法第十一天|239. 滑动窗口最大值|347.前 K 个高频元素

deque.isEmpty()&&deque.getLast()

2023-01-12 15:44:44 47

原创 算法第十天|20. 有效的括号|1047. 删除字符串中的所有相邻重复项|150. 逆波兰表达式求值

此外,在做几天基础数据结构的回顾,双向队列deque用push存放数据时,此时可以看作是栈,peek()方法弹出的是栈顶的元素,如果用offer()存放数据,此时是队列,peek()弹出的是队头的元素。本题需要将每个符号(+-*/)和左边的两个数字元素(或者前面元素的运算结果)去做运算,自然想到利用栈去保存元素。报空指针异常,且代码逻辑错,如果匹配的不是对应右括号,不做任何操作是不合适的。与上一题类似,之前是匹配左右括号,本题是匹配相邻元素,还是用栈解决。150. 逆波兰表达式求值。

2023-01-08 16:53:33 44

原创 算法第九天|232.用栈实现队列|225. 用队列实现栈

用栈实现队列用队列实现栈。

2023-01-07 01:15:15 56

原创 算法第八天|459.重复的子字符串

去掉首位后仍然包含原本来的字符串。

2023-01-04 16:32:15 48

原创 算法第七天|344.反转字符串| 541. 反转字符串II | |剑指Offer 05.替换空格151.翻转字符串里的单词||剑指Offer58-II.左旋转字符串

这题就是在一次次bug中调出来的,没有什么技巧,但想一次性写对还有些麻烦,方法不是很好,直接从后往前遍历,取出单词代码会简洁一些。

2023-01-04 14:03:23 48

原创 算法第六天|454.四数相加II |383. 赎金信 | 15. 三数之和 |18. 四数之和

四数相加,思路和三数相加一致,在外面多包一层for循环,对nums[i]做判断时,不能直接nums[i] > target了(nums[i] > target不能保证nums[i]+nums[j]+nums[left]+nums[right] > target),应该变成。同样需要注意的是,nums[i]+nums[j]>target也不能保证其他时候的nums[i]+nums[j]+nums[left]+nums[right] > target,如果写成这样就错了。

2022-12-23 00:48:46 56

原创 算法第五天|242.有效的字母异位词 |349. 两个数组的交集|202. 快乐数|1.两数之和

看了题解后,觉得答案的方法更简洁,因为这里是比较的字母的字符串,可以用一张长度为26的数组存放元素,元素按自然顺序对应数组的下标,存放出现的次数,代码附上。这题第一次做是没有思路的,看完题解后,大致思路是这样的,我们对快乐数每一位平方后求和,最后会变成1,如果不是快乐数,可能sum会。,这里使用哈希法,来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止,代码如下。但始终变不到 1,那我们就需要判断这个sum 是否出现过,因此,我们把问题转化为。

2022-12-20 00:31:01 49

原创 算法第四天|24.两两交换链表中节点|19.删除链表中倒数第N个节点|链表相交|142.环形链表2

算法第四天|24.两两交换链表中节点|19.删除链表中倒数第N个节点|链表相交|142.环形链表2

2022-11-27 22:47:19 134

原创 算法第三天|203.移除链表元素|707.设计链表|206.反转链表

203.移除链表元素|707.设计链表|206.反转链表

2022-11-22 17:15:42 157

原创 算法第二天|977.有序数组的平方|209.长度最小的子数组|59螺旋矩阵2

算法第二天|977.有序数组的平方|209.长度最小的子数组|59螺旋矩阵2

2022-11-19 20:22:23 63

原创 算法第一天|704.二分查找|27.移除元素

leecode刷题记录

2022-11-17 20:03:07 75

原创 基于vue axios用户注册重复校验的问题(二)

上一篇基于vue axios用户注册重复校验的问题(一)中,通过async,await关键字解决异步请求返回值时间问题后,点击注册按钮提交表单信息会发现存在另一个问题,无论用户查重结果如何,都能通过注册,数据库表中出现重复信息立马反应到checkUsername()中的返回值并没有真正返回,代码如下checkRegist()中先禁止表单提交,添加如下几行代码,把checkUsername()的返回值打印出来看看:输出结果是一个object promise对象..

2022-04-17 14:47:08 1553

原创 基于vue axios用户注册重复校验的问题(一)

​​​​2.问题现象输入新用户名输入已有用户名前台页面在输入用户名时通过发送ajax请求查询数据库,确实查到重复用户名,但不能成功在控制台打印信息,看上去像是then回调函数中的方法没有被执行,如果没有被执行,前台又怎会成功提示用户名存在呢?3.原因分析1)Ajax作为异步请求,被发送时then作为回调函数它需要等到服务器给出响应后才会执行其中的步骤;2)在前台收到服务器响应前会继续向下执行其他代码,此时打印的fla...

2022-04-17 13:34:23 886

原创 记录Ubuntu 下 JDK17 的安装

安装准备:jdk17安装包官网下载地址:https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.deb 下载完成后运行安装包:jdk-17_linux-x64_bin.deb点击安装后,输入当前用户密码验证即可自动安装安装成功后显示如下界面jdk安装路径为:/usr/lib/jvm配置环境变量:使用命令打开环境变量配置文件: sudo vi /etc/environ..

2022-03-31 15:49:57 1587

空空如也

空空如也

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

TA关注的人

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