- 博客(73)
- 收藏
- 关注
原创 --- 哈希表和哈希冲突 ---
实现:在哈希表中储存的是一个链表,当冲突的元素就直接储存再这个链表中,再查找时就先通过哈希函数找到这个链表,再遍历这个链表来获取到元素,因为冲突的次数一般都是常熟级的,所以遍历这个链表的时间也可以近似忽略,所以搜索还是O(1) 的复杂度。再删除元素的时候,采用的是标志位的伪删除法,因为使用线性探测法,一个哈希地址对应的有可能是多个元素,而这其他的元素,要基于这个哈希地址来往后查找,如果这个位置被删除了,那么就表示这里就没有元素,而和他冲突的元素也就不存在了。
2025-08-18 17:13:54
275
原创 --- mybatis动态sql---
在mybatis早期时间(1.x/2.x)是使用xml格式来编写动态sql,现在3.x的版本还可以使用,把sql语句写在单独的java类中,通过注解来引用sql。where标签对where标签中的语句进行校准,会自动去除and前后缀的问题,且如果判断语句为空的话,他就不会添加上where语句。对于经常使用的字段可以提取出来写在sql中,通过<include> 和 对应id来添加到语句中。直接进行if标签的拼接,有可能会碰到逗号的前后缀问题,可以使用trim来解决前后缀。open:字符串开头拼接上的字符串。
2025-08-14 16:48:31
359
原创 --- 堆和优先级队列区别 ---
将堆顶元素和最后一个元素交换,记录堆元素个数变量 heapSize--,从堆顶start开始向下调整(shift down),如果start值大于子节点左右都可以,就将他们俩个交换,start走到对应的子节点位置,继续向下调整,直到子节点都大于父节点,或者子节点下标越界了(走到了最后一层)先将元素插入到数组的最后,从最后位置 end 开始向上调整(shift up),如果父节点大于end的值,那么就将他们交换,并且end走到父节点下标,一直重复这个过程,直到父节点小于end的值或者end走到了根节点。
2025-08-12 12:32:21
275
原创 --- nacos注册中心 ---
创建一个RestTemplate bean用来发起http请求,在不加上LoadBalanced注解的话,他可以发起正常的ip请求比如http://127.0.0.1这样的,加上了,他就会根据服务名字来从nacos中获取到对应的服务信息,再来调用对应的接口http://hadage/self1。服务在启动时,会先从nacos配置中心中读取配置,在合并到配置文件中,nacos规定了,在boostrap.yml 或boostrap.properties中读取nacos配置中心相关配置。
2025-08-11 16:51:14
832
原创 --- Eureka 服务注册发现 ---
fetch-registry: false #表⽰是否从Eureka Server获取注册信息,默认为true.因为这是⼀个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,这⾥设置为false。register-with-eureka: false #表⽰是否将⾃⼰注册到Eureka Server,默认为true.由于当前应⽤就是Eureka Server,故⽽设置为false.#设置与Eureka Server的地址, 查询服务和注册服务都需要依赖这个地址。
2025-08-07 16:53:04
358
原创 --- 服务注册和发现 ---
在微服务中想要调用其他的服务方法,需要使用这个方法写死的url来调用,比如http://localhost:8081/product/productId 这样,在使用的微服务少的情况下还是能用,但是每次都需要记住每个服务对应的url,还是太过麻烦了,那么于是就想了下,能不能创建一个独立的服务,让每个微服务在启动之后在他那里登记,然后当微服务需要调用到其他服务时,又从他那里获取到,这不就能解决问题了,这就是注册中心。AP架构:优先服务的响应而放回的是V0的数据,即使不是准确的数据。服务中心主要有俩种行为。
2025-08-07 15:48:15
128
原创 org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size exceeded 的解决方式
max-swallow-size: 100MB 我的spring boot版本是3.4.5 可以看到并不能解决问题。于是又找到了另一种可以成功修改的方法。我根据网上和ai说的修改这个配置。
2025-07-29 09:05:17
118
原创 --- redis数据结构和内部编码 ---
使用对应的指令就和以储存不同结构的数据,单这些数据在真正储存到redis中时,redis会根据这些数据的实际情况来进行不同的优化,所以我数据加入到redis时的内部结构和在redis实际储存时的内部编码会有一些差别。redis对外提供了5中数据结构 string字符串 list链表 hash哈希 set集合 zset有序集合。内部编码是redis自己底层实现的数据结构。
2025-07-17 10:58:24
171
原创 --- bean 的六种作用域 ---
在注入bean的时候需不需要创建一个新的bean,spring提供了6种模式来适配不同的环境下这个bean作用域。
2025-07-16 20:41:48
180
原创 --- Bean 的生命周期 ---
在图中可以知道,并没有方法所在的区块,这不是我故意没画出来,在实例化类的时候,他并不会把方法也复制一份给对象,而实际能运行的方法是储存在类信息块中的,调用方法是通过调用klass pointer来在类信息中找到对应的方法并执行。在jvm堆内存中为这个bean分配空间, 这时这个对象就有了物理空间,具体这个对象在内存上的储存可以这样理解。在对象头中储存了一些对象的信息,比如锁 gc信息 哈希值 什么的,其中这里面又个很重要的是。将这个bean对象注入到代码中,这时在代码中应用bean的字段就不会为空了。
2025-07-16 20:31:47
266
原创 -- 明明正常配置了ssh隧道,但是实际使用起来却发现就是没通的解决方式 --
还不行重启服务器最方便 ,这样隧道的问题大多解决了,也不用管是不是xshell是否时隧道建立失败了 数据是否是发送到了服务器 端口号是否是没有开放,这些都是不用管的,😂😂😂都是我踩的坑。如果你发现自己ssh就是正确设置了,咋检查都是对的,开放的端口号也是有进程在监控的,那就不用怀疑是自己的问题了,很有可能是因为ssh自己的隧道转发功能没有打开。之后重启下ssh功能 如果说ssh.service的文件已修改 可以运行systemctl daemon-reload来重新读取。
2025-07-03 15:26:52
174
原创 win11 开启自动隐藏任务栏在网页全屏状态下不能置于顶层,且任务栏在唤醒之后不能置于页面的最顶层
geforce experience关了就好了,但我试了并不行让后才发现,把把惠普的omen进程给关了就好了。这个bug我看别人也有遇到过,他是把nvida的全屏捕捉给关了就好了,就是那个alt + z唤醒。,这只是暂时的解决方式,等hp修复这个bug把。
2025-05-31 10:47:41
259
1
原创 --- 动态sql的使用 ---
where>标签,他能去掉前置后置逗号和and,还能在where中为空的时候,去掉这个where条件语句,而使用trim不行,他会在判断条件为空字符串的时候还会有where存在从而导致sql的报错。item:表示这个参数的值可以用被那个字段引用,这里的id表示的是可以被where后面的id引用 separator:在每个值之间添加字符串。他的核心实现是在xml格式的sql中依靠<if></if>标签来实现的,如果if中的条件判断为真,那么就会加上标签中的语句。suffix:在后面加上字符串。
2025-04-01 19:42:57
366
原创 --- spring IOC和DI ---
在写项目的时候每次在调用的对象的时候,都需要先导入对应的包和手动实例化这个对象,如果对象少的话还能接收,但是spring提供了更好的解决方式,spring是一个IOC(控制反转)容器,他可以储存对象,在你需要的时候给你注入(DI)这样就免去了你创建对象的操作,在使用的时候只需要使用一个注解就能轻松创建了,而且还能轻松达到解耦的目的。使用类注解@Component注解来修饰需要交给spring管理的对象,会将自定义的类型注册成bean,为了更好的分辨不同层的业务,spring提供了更多的类注释。
2025-03-28 09:05:26
654
原创 --- mysql索引 ---
页是mysql从磁盘中读取数据的最小单元,默认大小为16kb,若数据大小不够还是16kb大小,在读取数据的时候,在磁盘中的读取是最慢的,而每次以页为单位来读,读取到的地址都是连续的,根据旱的旱死 涝的涝死的原理,在读取这个页的数据,那么下一次也是大概率是这页的,能有效的减少磁盘的io次数,增加查找效率。在获取数据的时候,可以直接从最小行开始遍历,但是每个页有16kb储存了上百行数据,这样就会耗费不少的时间,为了提高效率,InnoDb储存引擎在页中查询的时候使用二分查找的方式。
2025-03-12 10:45:26
817
原创 --- lombok添加但是实际运行调用时失败的解决 ---
如果这样修改了还不行,刷新maven,这三样。在创建项目的时候修改pom文件为这样。
2025-02-28 15:42:04
226
原创 --- spring MVC ---
spirng mvc中controller实现了选择模型和视图的功能,而在spring mvc中已经支持了视图的处理,具体是通过委派给集成的第三方库来实现数据的渲染,比如返回一个类,控制器只需要直接return这个类就好,spring mvc会自动的选择对应的json转换视图模型来对这个类进行转换并返回响应。HttpServletRequest类是servlet的类,记录的发来的请求的所有信息,在这之上的获取值得方法其实都是封装了这个类的方法,可以说你想从请求中获取什么都可以在这里获取到。
2025-02-26 15:18:51
473
原创 --- Cookie和Session ---
http请求是无状态的,那么他就不会记录下之前的交流的,这对于某些场景下会是一个很严重的缺陷,比如你需要重复登录网站,电商平台无法查看购买记录,那么为了解决这一问题,于是Cookie就被设计了出来,但是在最开始使用Cookie的时候,会有许多的安全问题,隐私问题和安全问题,之后又设计出了Session来解决这一个问题,将重要的数据储存在服务器中,而Cookie只是一个获取这些数据的钥匙。Cookie是储存在客户端的数据片段,通过键值对储存,且为了安全都是使用的是字符串的格式储存。
2025-02-24 10:54:22
156
原创 --- Mysql事务 ---
当事务A在对数据使用区域查找到CDE之后,CDE都是被上锁,那么事务B不能修改CDE但是,B可以插入数据F到C之后,那么在B提交之后数据变成了CBDE了,这时事务A又使用相同的查询,结果发现结果为CBDE了,这俩次查询到了数据又不同了,这种现象就叫做幻读。为了解决不可重复读的问题,可重复读加入了行级锁,可重复锁会给事务使用过的数据按行为单位上锁,这样就不允许别的事务去使用,于是就解决了不可重复读的问题,可是这样也会引起新的问题,幻读。那么为了解决脏读和不可重复读的问题,可以使用可恶重复读。
2025-02-17 20:15:00
531
原创 --- jvm中一个类的一生 ---
双亲委派模型确保了都是最先从标准库中加载的,且确保了一个类只会被加载一次,比如有类A 有类B,他们都有相同父类C,在加载A的时候,会加载父类C,而在加载B的时候,发现父类已经被加载并缓存了,那么就会直接返回这个加载好的父类C,而且也不出现不同加载器加载了同一个类名的情况,因为每次加载的路径相同。加载 --> 连接--> 初始化 --> 使用 --> 卸载 这就当程序运行起来后,一个类在jvm中的一生。使用 就是通过代码对这个类的使用,卸载,在这个类不会在使用之后,通过gc来将这个类释放,返回资源。
2025-02-15 16:27:01
655
原创 在本地顺利的部署一个al模型从零开始 windows
引言 (踩的坑,省流引言的内容没有有使模型跑起来)最近想在本地部署一个deepseek模型,就在网上搞了3 4天终于是能够部署下来了,在部署的时候也是成功的踩了无数的坑,比如我先问al如何在本地部署一个语言模型,al给我的建议是,先去hugging face中下好你要的模型,当然hugging face是访问不了的,要访问进行hf_mirror这个,然后去复制模型的下载链接然后我得到了这个。
2025-02-06 20:36:22
1148
原创 --- 线程安全问题及其解决 ---
破坏了操作的原子性,可能一个连续的复合操作在排序后变为了几个独立的步骤,这就是的在执行其他步骤时其他线程无法看到其中数据的跟新,而导致读取的数据错误。这里我t1会应为flg==1而进行死循环,而我在t2循环这个输入一个值而更改了flg的循环,按理说在我更改了flg的值之后,t1循环会退出,整个进程最终会结束,但是实际的运行结果却不是这样的,我在更改完了flg这个值之后,发现循环并没有退出,这说明在t1中读取到的flg并不是我更该后的值,而还是最初读取到的0,那这是什么原因呢。
2025-01-15 14:04:17
777
原创 --- 多线程编程 基本用法 java ---
在线程中使用外部的局部变量的话会有风险,比如但我创建好了线程,并使用了外部变量a这时我的main函数执行完毕,a变量被销毁了,这时我在线程中还对这个变量进行了更改,那这肯定会出错,使用了一个不存在的变量,于是为了避免这样的事在java中的做法是在线程中拷贝一份这个变量,于是外面的变量是什么状况就和我无关了,然而还有情况,如果在线程中将这个变量更改了,但是外面有没改,这样一边改了,一边又没改,这就又会出错,于是在设计时决定,进程和进程之间是不会共享空间的,而线程和线程之间共享进程的空间。
2025-01-12 21:54:22
623
原创 --- 网络编程套接字 ---
这样一次请求的接收和返回响应的过程就写完了,不过只是这样写的话,他处理一次请求就会结束了,所以需要在外面套一个while(true)死循环来接收请求,还有这个服务器程序是运行在自己的电脑上的,我们是用127.0.0.1 这个IP地址来表示自己的主机,具体点来说这个程序是运行在ip地址为127.0.0.1,端口号为8888中。在的到返回的数据在对这个数据进行包装,然后发送回去,要将数据发送回去,就需要知道发送端的ip地址,端口号,这俩个数据都储存在最开始收到数据的packet类中。
2025-01-04 20:54:30
628
原创 --- UDP和TCP传输协议 ---
在没有引入滑动窗口机制传输的话,每次数据的传输都需要收到接收方返回的ack之后才会继续发送下一个数据,但是这样的话,发送的效率太低了,于是就有了滑动窗口,他的窗口大小表示了能不等待ack放回的发送数据的最大大小,比如如果滑动窗口的大小为200,那么在发送是就会直接把1-100 和100-200这个数据包给发送出去而不会等待ack的返回,这样大大的增加了效率,窗口越大,代表数据的吞吐量越大,发送的数据的速度也就会更大。
2025-01-01 18:29:35
1733
原创 --- 网络基础 ---
在一定的范围内将一定数量的设备联系在一起, 这些设备就够成了局域网,比如我把我舍友的电脑通过网线联系在了一起,这就构成了一个局域网,只不过这个局域网和我们平时使用网络的不是同一个,并不能通过这个局域网来聊微信啥的,因为这个局域网并不能连到微信的服务器,但是可以让我们使用自己写的程序来让这几台设备进行数据的交流,需要设置一下设备的静态地址使他们能够知道对方的存在并且能够通过这网线来找到对方。物理层:规定了硬件的要求,将数据链路层的数据帧解析并通过对应的发送设备实际的发送出去,这时数据才真正的发送了出去。
2024-12-27 22:19:31
462
原创 --- stream 数据流 java ---
可以讲数据想象成一个流淌着数据的河流,一条讲cpu和文件数据联系起来的河流,对于数据的读取的类是InputStream,写入是OutPutStream,简单的判断就是你坐在cpu上,数据向你流过来,那么就是读取inputStream,数据从cpu出去,离你越来越远就是写入,OutputStream。InputStream是一个抽象类,使用时需要一个具体的实现类,对于inputStream实现类有很多可以认为每一种输入的对象都有一个单独的实现类。这是对于数据的操作就是我们所熟悉的scanner对应的方法了。
2024-11-25 20:53:24
439
原创 --- 文件IO java ---
文件再底层其实就是以一段二进制数据的形式储存的,当我用记事本打开文件时,有些文件会出现乱码,这就是二进制文件,而有一些文件是特殊的,他以特定的编码方式(比如ascll)可以翻译为可阅读的信息,那就是文本文件 还有富文本类型,他不仅仅只储存文本内容,他还可以储存图片,字体颜色,字体大小等等多种信息。相对路径:根据你打开方式的不同他所指向的位置是不同的,具体的位置是取决于你这个项目所在的位置,他指向的就是这个项目的父目录的路径。绝对路径:从根目录开始的逐级表示出来的唯一指向一个文件的路径。
2024-11-23 22:54:47
617
原创 -- HashMap Hashtable ConcurrentHashMap 的区别--
这时在java8的时期对ConcurrentHashMap的实现进行了大改,摒弃了之前的分段锁,改用了更加灵活的并发控制策略,而在之前的分段锁就是将哈希桶分为几个部分,并对没有部分单独上锁,减小了锁的细粒度,但是还是还效率下比低,且代码也很复杂,而更加灵活的并发控制策略,他对哈希桶的每一个链表来上锁和通过CAS来对数据进行操作,而对应的锁对象就是链表的第一个元素,这样在对不同链表上进行的操作就不会影响他们之间的并发执行,大大提高了效率。这样的实现在内存中占用大,且扩容很复杂。
2024-11-01 22:46:31
307
1
原创 ---synchronized 关键字---
对于加了synchronized的代码块会在一个线程获得锁后执行对应的逻辑,在逻辑执行完后解锁,这时起他的线程才能获取锁,否者线程就会进入阻塞等待过程中,这样就能解决内存可见性的问题。1 A B 同时得到了c 那么,c在A中的值为2,c在B中的值也为2,那么对他进行加一,那么最终结果c的值就是3 这就产生内存可见性的问题。对于死锁的解决方法可以规定每把锁的索取顺序,必须要等锁1 获取了才能锁2,否者就进入阻塞等待的情况,这样就能很好的避免死锁。synchronized(锁对象){
2024-10-29 21:11:59
299
原创 一个可以调节笔记本亮度的程序
第二种 比较简单,因为我发现你把这个程序打成就jar包就可以直接运行了,而且你通过exe4j把他变成了可执行文件再执行时其实就是执行的时jar包,所以为何不直接就执行jar包呢,我试了下可以,也可以创建个快捷方式 到桌面照样正常使用。不过要注意的是这个项目不能直接再桌面就运行,因为这个源码你还不能直接就运行到JVM虚拟机上,这里要想放在桌面直接运行。// 在这里可以添加实际的亮度调节代码。//设置主键个空隙 下方显示的数字之间的间隙。//更改滑条下方显示的值。//获得滑块对应的值。//是否需要刻度标记。
2024-10-26 22:15:13
1124
2
原创 --- 单例模式 ---
在一些特定情况下,对于我们设计得类我们只想他只能存在一个实例对象,如果是让调用者自己来确认该对象是否创建过然后来判断这个对象能否创建得话是有风险的,所以我们就得在程序的设计上来实现这一操作。在类的加载时就把这个对象给创建了,就像是个饿了很久的人,看到吃的赶紧去吃了,这个对象的创建也是,看到有资源就赶紧使用来创建了。因为不能让别人能够实例化这个对对象,要将构造方法私有化,然后再这个类中使用一个静态变量创建这个对象,再之后返回这个对象就好。
2024-10-26 19:38:01
579
原创 --- java线程的几种状态的含义 ---
因为当线程结束后这个线程就会被标记为terminated表示这个线程的生命周期已经结束了,且他说申请的系统支援也会被回收,如果要对一个已经结束的线程重新启动那么就会导致线程的资源管理变得复杂,而且线程通常设计来就是一次性使用的。通过线程的状态能很好的描述当前线程的执行状况 通过方法getstate()可以看到。TERMINATED 终止线程运行结束,但是线程这个类还存在 不能再次start。RUNNABLE 线程正在运行中也可以是线程已就绪可以直接在cup上运行。
2024-10-26 19:09:11
283
原创 MySql外键约束
key 列 UNI表示该行有unique约束 PRI表示有primary key 约束 default 那行就表示默认约束。check 约束 约束插入的数据内容 插入改行的数据内容就只能是check中指定的那几个数据。MUL就表示外键约束 有了外键约束 添加的数据必须和他关联的表中有的。约束的表要等被约束的表(有外键约束的那个表)删除之后才可以删除。对储存数据的约束,确保储存数据的准确性。并显示的默认的值是什么 extra 表示额外添加的属性。外键约束的作用就体现出来了 保证了数据的准确性。
2024-10-10 17:59:56
405
原创 MySql的基本语法操作
查看所有的数据库建立一个新的数据库也可以是表示这个数据库不存在才建立 而不会打断其他sql语句的执行,而如果没有加的话,创建的数据库存在就会直接报错终止程序的执行数据库中储存数据的表是数据的主要组织单元查看数据库中的表时,需要先使用这个数据库查看所拥有的表。
2024-10-06 23:01:51
981
原创 --- java数据结构 map set ---
因为表长的定值,所以a和储存和储存的元素个数的数量成正比,而储存的元素数量越多,那么他的发生哈希冲突的概率越高,在开发地址中冲突率应该在0.7~0.8之间,超过这个区间,那么在查找过程中发生哈希冲突的概率按曲线上升,会大大减低哈希表的查询效率。在哈希底层的空间大小是小于实际储存数据所需要的大小,因为要达到O(1)的访问速度,那么就需要用到数组,通过下标直接访问该位置,算出的哈希地址会是充满随机性的,数组的大小不够是经常的事,那么发生冲突就是难以避免的,而我们能做的也就是降低冲突率。
2024-10-01 10:51:10
589
原创 --- 数据结构 优先级队列 --- java
之前提高到队列是一种先进先出的结构,但是在某些情况下操作的数据具有优先级,那么对他先进行操作,这时队列就不能满足需求了,因为队列只能操作对头的元素,而具有优先级的数据不一定是在对头,这样就需要优先级队列(PriorityQueue)了,优先级队列能返回优先级高的数据,添加新的对象。向下调整 因为初始时的数组并不是一个堆,那么就需要从最后开始堆他开始调整,根据对应i 的左节点为 i*2 +1右节点是i*2+2,如果根节点小于子节点,那么就和他进行交换,若 i 的父节点J。poll 删除的是堆顶的元素。
2024-09-13 17:04:27
575
原创 --- 数据结构 二叉树 --- java
先递节点的左右节点,节点1左右节点2 3,都是先递归左边,递到2 的左右节点 4 5,4 的左右节点null 返回0,这时4这个节点就算是递归完了,返回1再递到5的左右节点 null 81 ,81 的左右节点 null 8,8的左右节点null 这时8递归完了,返回1,接着81也递归完了返回2(1+1),因为需要加上每次返回的值。接着5也递归完了,返回会3,这时4返回的是1,5返回的是3,5节点返回的值大于4节点,最终2的返回值也即是5节点的值加一4 ,这样树的递归也就写出来了。
2024-09-10 13:14:43
896
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人