自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

深夜敲代码

分享日常编程学习

  • 博客(64)
  • 收藏
  • 关注

原创 Mybatis---入门

1.什么是MyBatis?1.什么是MyBatis?MyBatis是⼀款优秀的框架,⽤于简化JDBC的开发。MyBatis本是 Apache的⼀个开源项⽬iBatis,2010年这个项⽬由apache迁移到了google code,并且改名为MyBatis。2013年11⽉迁移到Github.在上⾯我们提到⼀个词:持久层持久层:指的就是持久化操作的层, 通常指数据访问层(dao), 是⽤来操作数据库的总而言之,Mybatis就是一个用于更加方便与数据库交互的框架。

2025-04-04 17:43:36 505

原创 Java实现一个验证码校验(SpringBoot配置练习)

请求:请求响应: 验证码图⽚内容浏览器给服务器发送⼀个这样的请求, 服务器返回⼀个图⽚, 浏览器显⽰在⻚⾯上2. 校验验证码是否正确请求: /captcha/check请求请求参数: captcha=xn8d //用户输入验证码响应:true根据⽤⼾输⼊的验证码, 校验验证码是否正确. true: 验证成功. false: 验证失败。

2025-04-02 12:12:40 221

原创 Spring----ioc

其实IoC我们在前⾯已经使⽤了, 我们在进行前后端访问时,在后端类上⾯添加和@Controller 注解, 就是把这个对象交给Spring管理, Spring 框架启动时就会加载该类. 把对象交给Spring管理, 就是IoC思想.IoC: Inversion of Control (控制反转), 也就是说 Spring 是⼀个"控制反转"的容器.什么是控制反转呢?也就是控制权反转. 什么的控制权发⽣了反转?

2025-03-26 23:12:24 815

原创 解决 Not allowed to load local resource 问题

记录一下遇到的问题:html跳转本地资源,用相对路径。绝对路径也行,不过要加入一些配置,可以自行搜索。网络路径也行,慢了一点。

2025-03-25 22:41:14 167

原创 每日一题---根据二叉树创建字符串

还有要注意最后返回的StringBuffer要把头部与尾部的()去除,使用substring()进行裁剪。然后就是注意细节:当左边为空,右边不为空时,还需要额外打印一个“()”思想:按照先序遍历的思想,在遍历打印数字之前打印一下()先序遍历是先打印根节点,然后递归左右节点。

2025-03-20 13:02:33 103

原创 每日一题---二叉树的公共祖先

通过递归来遍历整个二叉树,递归函数的作用就是寻找该节点是否是p/q,并且能够回到(回溯)之前的节点(祖先)用于向右边寻找,最终通过结束条件返回祖先。第二种情况回溯到右边也没找到,就认为另一个也在左边,并且在该节点下面,在最后判断右边为空,直接返回左节点即可。第一种情况,会回溯到祖先继续向右寻找,这样从下面向上找,找到了就返回该节点,保证了找到的一定是最近的公共祖先。先分析一下这道题的特点:这道题一定能找到公共祖先。细节:当在左边找到p/q时,向右边寻找是否有另一个。2.如果在右边就返回该节点。

2025-03-20 11:44:26 203

原创 每日一题---从中序与后序遍历序列构造二叉树

而由于中序遍历是 左根右 打印,可以根据后序遍历得到的根节点把数组分为左右两树。是相同子问题,并且终止条件是后序遍历的下标为0或中序遍历左下标 > 右下标(一会讲解):再后序遍历中从尾部找根节点,通过map获取下标,然后递归给左右节点完成建树。对于每一个后序遍历的靠后的节点都会把中序遍历分割后的数组分为左右两树。:HashMap(元素,下标)装填中序遍历方便根据后序遍历得到的。显然,由于后序遍历是 左右根 打印,最后一个数即为根节点。注意:递归是先构建右子树,因为后序遍历的最后是右边。

2025-03-19 22:01:32 301

原创 每日一题---二叉树的后序遍历(非递归)

如果是这种情况,右边被标记,那左边一定早被打印了(1.右为空2.右已经打印)当这样标记完成之后,如果其为右节点,则根节点就可以打印了。第二步细节:打印条件是要么右树为空,要么右树已经打印过。当第一次打印时,一定是左右同时为空,打印后标记这个节点。3.如果不满足,继续将该点入栈进入其右树重复上述操作。2.拿出一个栈中节点(出栈)判断其是否满足打印条件。1.一直入栈到左树末端(因为先打印左树)注:下文的打印在代码中均为入顺序表的意思。为了标记这个打印过的节点,引入tmp节点。思路一出,实现代码还不手到擒来。

2025-03-19 20:23:02 277

原创 每日一题---翻转二叉树

那么以上就是全部题解了,欢迎大家补充更多解题思路,如有问题也欢迎大家指正!这道题比较简单,所以有许多思路,我先展示个人认为最容易理解的递归。root出栈 root.left,root.right入栈。一次出栈两个并交换再入栈,直到为空...2.使用临时变量存储递归后的节点的左右。1.先处理业务,再完成向下递归的操作。这里借用Krahets的代码进行讲解。注意与对称二叉树区分。进行出栈-交换-入栈。

2025-03-17 23:25:35 163

原创 Java---SpringMVC(2)

下文使用postman模拟客户端传递信息。 注意事项 对于包装类型, 如果不传对应参数,Spring 接收到的数据则为null 所以对于参数可能为空的数据,建议使⽤包装类型 也可以这样传入:也可以不按顺序传入:有时候前端为了保证前端代码的保密性,会把参数的名字起得后端人员难以理解,这时我们就可以借助注解@RequestParam 来重命名前后端的参数值.将前端传入的参数名“q”重命名为keyword并且使⽤ @RequestParam 进⾏参数重命名时, 参数就变成了必传参数如果不传参数

2025-03-17 22:06:04 1250

原创 每日一题---链表的回文结构

因为这道题空间复杂度为O(1),所以不能创建数组之类的额外变量。

2025-03-17 19:17:43 137

原创 每日一题---反转链表(经典老题,附大量图解)

这是一道很经典的题,因为在许多其他的链表题中都需要使用(单独实现),所以我单独整理出来,供大家参考,互相学习。

2025-03-17 17:48:12 634

原创 每日一题---相交链表(双指针)

将两个链表的长度剪成相同长度,这样就变得很简单,只是剪的过程比较麻烦,我们可以分别遍历记录链表长度再截取,这里介绍一种个人感觉比较有趣的剪法。将一个链表的节点一个一个add进入set中,判断另一个节点有重复的吗,有的话就有相交的。思路与之前差不多,只是不在进行剪了,而是进行加法。看图可知最后一定会达到判断相同节点的地方(如果有)这个思路比较简单,但是空间复杂度较高。将两个链表的长度都补充为A+B。当A循环完成之后就继续循环B。B循环完成之后就循环A。将两个链表都变成A+B。

2025-03-17 14:17:31 155

原创 每日一题---环形链表II

通过创建快慢指针,快指针fa每次走两个节点,慢指针每次走1个节点,正常没有环时,两者是永远不会相遇的,但当存在环时,由于快指针会回头,当两者相遇时就说明链表存在环。答:使用双指针,另一个新的指针从head开始(head距离成环节点的距离恰好为a),当两者相遇,相遇点即为成环节点。走到这里break时两者就相遇了,但题目要求返回成环的节点,所以我们需要找其中的数学关系,找到成环节点。设fa到相遇节点走的路程为2s , 设fa比sl多走了mb圈,那么sl的路程就是2s-mb = s。如果链表无环,则返回。

2025-03-17 13:22:58 246

原创 前端---CSS(前端三剑客)

绿⾊

2025-03-16 21:32:32 591

原创 前端---初识HTML(前端三剑客)

HTML:超文本标记语言超⽂本: ⽐⽂本要强⼤. 通过链接和交互式⽅式来组织和呈现信息的⽂本形式. 不仅仅有⽂本, 还可能包含图⽚, ⾳频, 或者⾃已经审阅过它的学者所加的评注、补充或脚注等等1.1认识 HTML 标签HTML 代码是由 "标签" 构成的.形如:标签名 (body) 放到 < > 中⼤部分标签成对出现.<h1>为开始标签,</h2>为结束标签.少数标签只有开始标签, 称为 "".开始标签和结束标签之间, 写的是标签的内容.

2025-03-16 20:10:39 1633

原创 Java---网络初识

本文章用于理解网络中的各个关键字。

2025-03-16 11:07:58 369

原创 每日一题---腐烂的苹果(广度优先搜索)

腐烂的苹果每分钟会向上下左右四个方向的苹果传播一次病菌,并导致相邻的苹果腐烂。2.每分钟腐烂苹果都会向四周扩散,将队列中的腐烂苹果弹出,并向四周扩散,使用vis记录被感染的苹果,并把被传染的苹果再次加入队列。数据范围: 1≤n,m≤1000 1≤n,m≤1000 ,网格中的值满足 0≤val≤2 0≤val≤2。其中 0 表示这个格子为空、1 表示这个格子有一个完好的苹果,2 表示这个格子有一个腐烂的苹果。给定一个 n×m n×m 的网格,其中每个单元格中可能有三种值中的一个 0 , 1 , 2。

2025-03-15 22:46:54 263

原创 每日一题---单词搜索(深搜)

在主函数中两层循环遍历整个二维数组,找出所有满足等于单词第一个字符的,然后创建一个深搜函数,把这个节点的下标.以及第几个字母传入dfs函数,这个函数用于判断单词是否在二维数组中.时间复杂度:单词起点一共有 n2个,单词的每个字母一共有上下左右四个方向可以选择,但由于不能走回头路,所以除了单词首字母外,仅有三种选择。,我们定义这样一种搜索顺序,即先枚举单词的起点,然后依次枚举单词的每个字母。单词由相邻单元格的字母连接而成,相邻单元指的是上下左右相邻。给出一个二维字符数组和一个单词,判断单词是否在数组中出现,

2025-03-15 21:52:18 261

原创 每日一题---dd爱框框(Java中输入数据过多)

实例:3 5这道题要解决Java中输入的数过多时,时间不足的的问题。

2025-03-15 20:18:14 408

原创 每日一题---数组中两个字符串的最小距离

给定一个字符串数组strs,再给定两个字符串str1和str2,返回在strs中str1和str2的最小距离,如果str1或str2为null,或不在strs中,返回-1。来源:牛客网输入包含有多行,第一输入一个整数n(1≤n≤105)(1 \leq n \leq 10^5)(1≤n≤105),代表数组strs的长度,第二行有两个字符串分别代表str1和str2,接下来n行,每行一个字符串,代表数组strs (保证题目中出现的所有字符串长度均小于等于10)。输出一行,包含一个整数,代表返回的值。

2025-03-15 17:31:24 454

原创 Java---JavaSpringMVC解析(1)

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为"SpringMVC"

2025-03-14 20:13:57 1101

原创 【每日一题】---字母异位词分组

从 map 中获取所有 value,构造结果列表,即 [ ["eat", "tea", "ate"], ["tan", "nat"], ["bat"] ]字符数组为 ['t', 'e', 'a'],排序后为 ['a', 'e', 't'],key 为 "aet"key 为 "aet",value 为 ["eat", "tea", "ate"]将 "tea" 添加到列表中,现在列表为 ["eat", "tea"]key 为 "ant",value 为 ["tan", "nat"]遍历字符串数组 strs。

2025-03-07 16:40:44 308

原创 Java内存模型

因此,在单个线程中,程序执行看起来是有序执行的,这一点要注意理解。语句2实际上包含2个操作,它先要去读取x的值,再将x的值写入工作内存,虽然读取x的值以及 将x的值写入工作内存 这2个操作都是原子性操作,但是合起来就不是原子性操作了。而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行。

2025-02-10 22:06:08 486

原创 Java---线程安全下的集合类

多线程环境使用 ArrayList原来的集合类, ⼤部分都不是线程安全的.Vector, Stack, HashTable, 是线程安全的(但不建议⽤), 其他的集合类不是线程安全的大多数是通过加synchronized关键字实现。

2025-02-10 13:52:17 732

原创 Java---JUC

1.定义一个类,实现callable接口2.通过匿名内部类的方式3.通过Lambda表达式的方式@OverrideSystem.out.println("执行任务...");//完成累加操作i <= 10;System.out.println("运算结束..."+"sum = " + sum);return sum;那么如何像Runnable一样搭配Thread?//搭配Future使用,获取Callable的执行结果看源码知它继承自Runnable。

2025-02-10 12:52:15 1031

原创 synchronized原理

1.基本特点1.基本特点只考虑 JDK 1.81. 开始时是乐观锁, 如果锁冲突频繁, 就转换为悲观锁.2. 开始是轻量级锁实现, 如果锁被持有的时间较⻓, 就转换成重量级锁.3. 实现轻量级锁的时候⼤概率⽤到的⾃旋锁策略4. 是⼀种不公平锁5. 是⼀种可重⼊锁6. 不是读写锁。

2025-02-09 14:32:48 639

原创 Java---锁策略及CAS

举个例子:在商场上厕所时,不同人对厕所门关不关有不同想法,有些人对此保持乐观态度,进厕所后不关门(加锁),想着人少,偷一下懒。这就是乐观锁,先不加锁,只做一下标记,或啥都不做。而有的人对此保持悲观,想着一定会有人来敲门打扰他,所以他每次上厕所都关门(加锁),这就是悲观锁。两者在对线程竞争是否激烈的态度上有区别。悲观锁认为多个线程访问同⼀个共享变量冲突的概率较⼤, 会在每次访问共享变量之前都去真正加锁.

2025-02-09 13:54:37 995

原创 Java----线程池

什么是线程池呢,先举一个情景:一个火锅店开业了,早上人比较少,大家进店后不需要预约,直接付款在上吃饭,慢慢的了,店里的桌子不够用了,没座位的人可以,等别人吃完后再吃,但是预约的人越来越多,店长就放到外面,让大家可以在外面就餐,如果人还是多,就了,当人变少的时候就把外面的桌子收回来。店长通过在人多的时候放临时桌子缓解,人少的时候再收回,节约了外面桌子的维护成本这就是线程池的工作原理。不可自定义,用的较少,下面介绍可以自定义的系统自带的线程池。

2025-02-06 20:49:35 346

原创 数据库(3)--针对列的CRUD操作

这是因为orderby是对select后的对象排序,在select中起的别名可以在orderby中识别。不对数据操作所以⽐DELETE更快,TRUNCATE在删除数据的时候,不经过真正的事物,所以⽆法回滚。如果value在optoin列表中,则返回TRUE(1),NOTIN则取反。MYSQL中会自动排序,如果没有orderby返回的顺序仅参考,不可信。如果比较对象中有null,默认null是最小的值(比所有数都小,包括负数)多个条件必须都为TRUE(1),结果才是TRUE(1)

2025-01-07 17:30:26 1149

原创 数据库(2)--建表 表操作

语法:createtableifnotexists表名(类型名类型comment‘注释内容’,...)设置字符集编码与排序规则;studentcomment'姓名'idbigintcomment'学号';如果student不存在,则创建一个student表。

2025-01-06 23:19:44 451

原创 数据库(1)--建库 库操作

DATABASE|SCHEMA:同义词,任选一个就行IFNOTEXISTS:如果已经存在了这个数据库,不会使代码终止,会提醒并继续向后执行(一般都加上)db_name:自定义的库名表示如果没有Test这个数据库就创建一个。

2025-01-06 22:26:27 256

原创 Thread类的start()和run()方法之间的区别?

结果上看:启动run方法只执行了一个Java普通方法,程序还是只有主线程,没有起到多线程的作用。run()方法:定义线程时指定线程要执行的任务如果调用只是Java对象的一个普通方法而已。start()方法:真实的申请系统线程PCB,从而启动一个线程,参与CPU调度.而启动start方法会再启动一个run方法,相当与异步操作。

2024-12-07 22:14:42 98

原创 单例模式--懒汉 饿汉模式

private:保证这个变量不可修改。static:保证全局唯一。

2024-12-07 22:14:10 715

原创 多线程---wait,notify解析

1.wait(),notify()是Object类中的方法join()是Thread类中的方法2.wait,notify针对的是同等级的线程(不相干)join针对的是主线程与子线程(相干)比如:家里要做饭,没有米了,我去米店买米。家里做饭是主线程,必须要等待我去买米(子线程)回来再开始。这就是join,必须等待子线程的结果。子线程是主线程的一部分。而我去米店买米(一个线程),可能老板没米了(wait),他去进货(另一个线程),进来货了,通知我(notify),这就是两个不相干的线程间的等待。

2024-12-06 20:24:07 232

原创 synchronized的特性

对于synchronized修饰的方法及代码块不同线程想同时进行访问就会互斥。就比如synchronized修饰代码块时,一个线程进入该代码块就会进行“加锁”。退出代码块时会进行“解锁”。当其他线程想要访问被加锁的代码块时,就会。阻塞等待:针对每⼀把锁, 操作系统内部都维护了⼀个等待队列. 当这个锁被某个线程占有的时候, 其他线程尝试进⾏加锁, 就加不上了, 就会阻塞等待, ⼀直等到之前的线程解锁之后, 由操作系统唤醒⼀个新的线程,再来获取到这个锁。

2024-12-06 16:05:36 540

原创 线程安全问题发生的原因

由于线程之间是抢占式执行的,因此线程执行的顺序是随机的。并且线程由CPU调度的,不受人为控制(我们解决不了),因此这也是发生线程安全问题的主要原因。

2024-12-06 16:05:21 1009

原创 多线程---创建及方法

lambda里面如果使用局部变量触发“变量捕获需要把这个变量定义为全部的全局静态变量。

2024-12-04 23:40:41 1152

原创 多线程---线程安全(synchronized)

双线程累加100000操作结果同一线程对象 修改 同一共享变量用synchronized关键字修饰方法100000不同 线程对象 修改 同一共享变量用synchronized关键字修饰代码100000一个用synchronized关键字修饰代码块另一个不用synchronized修饰小于100000不同 线程对象执行synchronized方法修改全局变量小于100000多个实例对象调用synchronized方法新new一个对象作为 锁对象 锁代码块对全局变量进行累加。

2024-12-04 23:40:11 712

原创 进程与线程的区别

5.线程是CPU调度的最小单位,CPU上执行进程的指令都是以线程为单位执行的。4.当一个线程出现问题时,进程也会出现异常,但线程之间不会相互影响。2.每一个进程至少有一个线程,即:主线程。3.同一进程中的线程共享进程申请的资源。1.进程是系统分配资源的最小单位。

2024-11-28 23:03:56 131

空空如也

空空如也

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

TA关注的人

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