- 博客(251)
- 资源 (15)
- 收藏
- 关注
原创 SpringBoot+WebSocket双杀!三招搞定企业级聊天系统(附完整开源代码)
websocket官网介绍在线消息(双方都在线,正常发送消息)离线消息(一方不在线,发送消息储存起来,下次上线将存储的消息展示给对方看)群发消息(发送者将消息发送到所有在线的接收者)
2025-02-15 19:51:36
1109
原创 学会本篇文章,你也可以拥有自己的AI大模型
通过本文介绍的工具——OLLAMA和Chatbox AI,你已经掌握了从安装到运行的核心步骤。在 Chatbox AI的配置页面,输入你的AI访问令牌(API Key)。选择合适的系统版本:根据你的操作系统(Windows、MacOS或Linux)选择对应的版本进行下载。运行并配置:双击解压后的文件,等待安装完成。打开Chatbox AI界面,尝试发送一条简单的消息(例如“你好”),确保能够与AI模型成功通信。解压文件:将下载的exe文件解压到本地文件夹,例如 D:\IDE\Typora。
2025-02-05 19:59:25
829
原创 深入解析 HashMap 的 remove() 方法及其相关实现
HashMap 是 Java 中最常用的集合类之一,它提供了高效的键值对存储和检索功能。本文将详细解析 HashMap 的 remove() 方法及其相关的内部实现,包括 removeNode() 和 removeTreeNode() 方法。通过这些方法,我们可以了解 HashMap 如何高效地移除指定的键值对,并在必要时重新平衡红黑树结构。给出大致流程图,让我们来跟着流程图看源码。
2024-10-15 22:00:00
1219
1
原创 深入解析 HashMap 的 put() 方法及其相关实现
在 Java 编程中,HashMap 是一个非常常用且高效的集合类,用于存储键值对。它基于哈希表实现,提供了快速的插入、删除和查找操作。本文将深入探讨 HashMap 的 put() 方法及其相关的核心内部方法,包括如何处理哈希冲突、链表到红黑树的转换以及扩容机制。通过理解这些细节,你将能够更好地利用 HashMap 来优化你的应用程序,并解决可能出现的性能问题。先来看下hashMap插入数据的大致流程,以便我们接下来理解源码。
2024-10-12 08:30:00
1372
原创 深入理解 Java HashMap 的 get() 方法及其相关实现
在 Java 中,HashMap 是一个非常常用的数据结构,用于存储键值对。它提供了快速的查找、插入和删除操作。HashMap 的核心功能之一是根据键获取对应的值,这主要通过 get() 方法来实现。本文将详细介绍 HashMap 的 get() 方法及其相关的辅助方法,包括 getNode()、hash()、getTreeNode()、root()、find()、comparableClassFor() 和 compareComparables()。
2024-10-11 21:30:00
1867
6
原创 深入解析Java HashMap:从基础设置到内部结构
在Java集合框架中,HashMap 是一种非常高效且常用的数据结构,它基于哈希表实现,提供了快速的查找、插入和删除操作。理解 HashMap 的内部机制不仅对于日常开发至关重要,而且对于优化应用程序性能也有着重要作用。本文将详细探讨 HashMap 的基本属性、构造方法以及其内部节点 Node 的实现细节。通过这些内容,读者可以更深入地了解 HashMap 的工作原理,并能够更好地利用它来解决实际问题。下面我们来一步步掌握它。
2024-10-10 18:44:17
330
原创 PlantUML 时序图全面指南:从基础到高级
startumltitle 多行定义参与者=title----""参与者""A -> B@enduml。
2024-10-09 08:30:00
3172
原创 Java 8 Stream API:强大而灵活的数据处理流水线
Stream 中⽂称为 “流”,通过将集合转换为这么⼀种叫做 “流”的元素队列,通过声明性⽅式,能够对集合中的每个元素进⾏⼀系列并⾏或串⾏的流⽔线操作元素是特定类型的对象,所以元素集合看作⼀种流, 流在管道中传输, 且可以在管道的节点上进⾏处理, ⽐如 排序,聚合,过滤等操作操作详情数据元素便是原始集合,如list,set,map生成流,可以使串行流stream或者并行流parallelStream中间操作,可以使排序,聚合,过滤,转换等。
2024-09-09 09:00:00
853
原创 Java 8的关键新特性:Lambda表达式、Base64编码、日期时间API及Optional类
自从Java 8发布以来,它就标志着Java编程语言的一个重要转折点。这一版本不仅带来了诸多功能上的改进,还引入了一些革命性的特性,彻底改变了开发者编写代码的方式。Java 8的设计目标是让语言更加简洁、更具表现力,并且能够更好地适应多核处理器时代的需求。本文将探讨Java 8中最值得关注的新特性,包括Lambda表达式、Stream API、新的日期与时间API以及Optional类等。
2024-09-08 21:00:00
1094
原创 图形验证码从设计到实现
获取前端传过来的手机号以及图形验证码,根据ip以及网络地址相关西信息获取缓存key,根据key获取验证码,然后比较验证码是否一致,如果一致验证通过,删除缓存,执行发送短信相关业务。获取验证码的接口非常简单,调用验证码配置类获取验证码,将获取到的验证码缓存到redis中并设置过期时间,然后调用配置类传入验证码获取到图形验证码,通过IO流返回。上述我们主要讲述了用户登录获取验证码的逻辑,用户注册,找回密码逻辑都是差不多一样的,只是后续的处理不太一样,在这里就不再过多讲述了。再去看下校验验证码的这个接口,
2024-09-07 20:30:00
1392
原创 揭秘滑块图形验证码:从设计到实现的全过程
本文详细介绍了滑块图形验证码的生成逻辑及其后端实现细节。首先,根据项目需求选择合适的背景图片,并将其存储于项目的ClassPath或其他如云存储服务中。接着,服务器随机选取一张图片作为背景,并在其上随机裁剪出一个区域作为滑块,即所谓的“缺口”。此过程中的缺口参数(如位置、大小)是随机生成的,以此增加验证码的安全性。当用户请求需要验证的页面时,服务器将背景图与滑块图及验证所需的相关参数发送至前端。前端展示这些图像,并允许用户通过拖动滑块来填补缺口,以完成验证。
2024-08-26 08:54:28
999
原创 Elasticsearch8.x聚合查询全面指南:从理论到实战
类似于SQL中的GROUP BY操作,根据指定的条件对数据进行分组统计。可以进行嵌套分桶,即在一个分桶的基础上再进行细分。示例:按照手机的品牌进行分桶统计数量,再在小米手机的分桶基础上按照档次进行二次分桶。语法格式指标聚合(Metrics Aggregations)主要用于计算数值字段的统计信息,如平均值、最大值、最小值、求和、去重计数等。示例:计算某个班级、某个学科的最高分、最低分等。语法格式聚合查询的特点嵌套性:聚合查询支持嵌套,即一个聚合内部可以包含别的子聚合,实现复杂的数据挖掘和统计
2024-06-27 20:30:00
2030
原创 ElasticSearch8.X查询DSL语法案例进阶实战
Query DSL主要由两部分组成:查询和过滤。查询部分:用于指定搜索条件和匹配规则。例如,可以使用match查询进行全文检索,term查询进行精确匹配,range查询进行范围匹配等。过滤部分:用于对查询结果进行进一步的筛选和过滤。与查询查询不同,过滤查询不会影响得分计算,只是对结果进行简单的筛选操作。fuzzy查询是Elasticsearch中提供的一种模糊匹配查询类型,用在搜索时容忍一些拼写错误或近似匹配使用fuzzy查询,可以根据指定的编辑距离(即词之间不同字符的数量)来模糊匹配查询词。
2024-06-26 22:15:00
972
原创 深入解析Elasticsearch 8.4.1:Mapping与字段类型实战指南
在Elasticsearch中,Mapping定义了索引中每个字段的类型、属性以及设置。Mapping的作用是告诉Elasticsearch如何索引文档中的字段,包括如何分析字段值以及如何存储它们。分词即使将文本拆分成单独的单次或词项的过程分词是搜索引擎在建立索引和执行查询时的关键步骤,将文本拆分成单词,并构建倒排索引,可以实现更好的搜索和检索效果。分词规则是指如何将文本进行拆分的规则和算法。elasticsearch使用一些列的分词器(analyzer)和标记器(tokenizer)来处理文本内容。
2024-06-25 21:00:00
1786
原创 Elasticsearch 索引与文档操作实践指南
上节我们部署了elasticsearch8.4.1和kibana8.4.1以及ik分词器,本节我们来学习下elasticsearch的相关索引,文档操作。首先我们kinana的主界面找到开发者工具在里面我们来编写相关操作。
2024-06-24 22:18:59
805
原创 实战指南:部署Elasticsearch 8.4.1与Kibana 8.4.1并集成IK分词器
在本实战教程中,我们不仅解决了Docker镜像下载问题,通过配置镜像加速器顺利拉取了Elasticsearch与Kibana的最新镜像,还深入了解了如何自定义网络、优化容器启动参数,以及如何安全有效地启动这两个核心组件。这里有一个小错误,应该是-p 9200:9200 -p 9300:9300,分别将容器的9200端口(HTTP接口)和9300端口(TCP通信端口)映射到宿主机的相同端口,允许外部访问Elasticsearch服务。在Docker中,网络名称是唯一的,用于标识和引用特定的网络。
2024-06-23 20:52:51
1360
原创 XXL-Job实战(千万级短信推送实战)
经过细致的部署与实践,我们不仅成功搭建了基于XXL-Job的分布式短信发送系统雏形,还深入探索了其分片任务的强大功能,为应对双十一等大规模营销活动的短信推送挑战提供了强有力的技术支撑。可以看到,我们控制台也打印了相关日志,说明我们的demo执行成功了。名称就自己取一个就可以了,注册方式我们选择自动注册,也可以手动录入,看自己选择就可以了,选择保存,我们来到任务管理,选择添加任务。下面我们来开发我们的需求,在开发需求之前我们还需要了解下xxl-job中的分片任务,并以此来开发我们的需求。
2024-06-22 21:31:54
1478
原创 XXL-Job实战(一)
简单易用:Timer类提供了简单直观的API,使得开发者能够快速上手,实现基本的定时任务需求。创建一个定时任务只需几行代码即可完成。灵活性:Timer允许你安排任务在指定的延迟后执行一次,或者以固定的间隔重复执行。这对于很多简单的定时任务场景来说已经足够灵活。集成方便:作为Java标准库的一部分,Timer无需引入额外的依赖,可以直接在任何Java项目中使用,便于维护和移植单线程执行:Timer使用一个后台线程来执行所有安排的任务,这意味着所有任务都是串行执行的。
2024-06-20 21:31:39
1145
原创 SpringBoot运行流程源码分析------阶段三(Spring Boot外化配置源码解析)
首先看一下ApplicationArguments接口的具体方法定义及功能介绍。//返回原始未处理的参数(通过application传入的) String [ ] getSourceArgs();//返回所有参数的集合,如参数为:--foo=bar --debug,则返回【"foo","debug"】 Set < String > getOptionNames();//选项参数中是否包含指定名称的参数 boolean containsOption(String name);
2023-10-24 23:25:16
753
原创 SpringBoot运行流程源码分析------阶段二(run方法核心流程)
在上面的代码中,实例化监听器需要有一个默认的构造方法,且构造方法的参数为Class
2023-08-07 22:28:12
556
1
原创 算法------排序算法------插入排序法
插入排序法是将数组中的元素逐一已排好序的数据进行比较,先将前两个元素排好序,再将第三个插入适当的位置,以此类推,重复此步骤,知道排完序为止。
2023-06-26 21:48:47
223
原创 算法------排序算法------选择排序法
选择排序法也算是枚举法的应用,就是反复从未排序的数列中去除最小的元素加入到另一个数列中,最后的结果即为已排序的数列。选择排序法可以使用两种方式排序,即在所有的数据中,若从大到小排序,则将最大值放入第一个位置;若是从小到大排序,则将最小值放入到第一个位置。
2023-06-25 23:34:11
168
原创 算法------排序算法------冒泡排序法
冒泡排序法又称交换排序法,原理是从第一个元素开始,比较相邻元素的大小,如大小顺序有误,则对调后再进行下一个元素的比较,一次扫描之后可以确保最后一个元素位于正确的位置。接下来进行的第二次扫描,以此类推知道所有元素排序完成为止。例如下面的示例:由上图可知,5个元素的冒泡排序必须执行5-1次扫描,第一次扫描需要比较5-1次,第二次比较5-1-1次,以此类推,共比较4+3+2+1=10次。
2023-06-24 22:02:37
236
原创 SpringBoot构造流程源码分析------阶段一
在入口类主要通过SpringApplication的静态方法–run方法进行SpringApplication类的实例化操作,然后再针对实例化对象调用另一个run方法完成整个项目的初始化和启动。本章节重点围绕此过程的前半部分(即SpringApplication类的实例化)来讲解。//创建SpringApplication对象并执行某run方法 return(new SpringApplication(primarySources)) . run(args);
2023-06-20 22:39:25
815
原创 SpringBoot核心运行原理解析之------@Conditional条件注解
在SpringBoot核心运行原理解析之------@EnableAutoConfiguration文档中我们完成了自动配置类的读取和筛选,在这个过程中已经涉及了像@ConditionalOnClass这样的条件注解。打开每个自动配置类,都会看到@Conditional或其衍生的条件注解,本节我们来认识下@Conditional注解。
2023-05-17 21:11:52
855
原创 SpringBoot核心运行原理解析之-------@EnableAutoConfiguration
下面通过一张图来从整体了解AutoConfigurationImportSelector的核心功能及流程,然后再对照源码看具体的功能实现。当AutoConfigurationImportSelector被@Import注解引入之后,它的selectImports方法会被调用并执行其实现的自动装配逻辑。selectImports方法涵盖了组件自动装配的所有的处理逻辑。if(!if(!
2023-05-16 15:54:12
4640
原创 如何理解ThreadLocal
也就是说,调用ThreadLocal的set()方法存储的本地变量在具体线程的内存空间中,而ThreadLocal类支提供了set()和get()方法来存储和读取本地变量的值,当调用ThreadLocal类的set()方法时,把要存储的值存储在调用线程的threadLocals变量中,当调用ThreadLocal类的get()方法时,从当前线程的threadLocals变量中获取保存的值。保存数据时传递的key为当前ThreadLocal的this对象,而传递的value为调用set()方法传递的值。
2023-04-22 21:35:10
514
原创 如何理解线程池
当调用Executors.newSingleThreadExecutor方法创建线程池时,表示创建只有一个工作线程的线程池,即线程池中只有一个线程执行任务,能够保证提交到线程池中的所有任务按照先进先出的顺序,或者按照某个优先级的顺序来执行。如果在向线程池提交新任务时,线程池中无空闲线程,则新创建线程来执行任务。在调用shutdownNow()方法关闭线程时,线程池不能接受新提交的任务,也不能继续处理阻塞队列中的任务,同时,还会中断正在执行的线程,使得正在执行的任务被中断,线程池立即关闭并抛出异常。
2023-04-19 22:55:50
402
原创 如何理解CAS
ABA问题简单来说就是一个变量的初始值为A,被修改为B,然后再次被修改为A了。在使用CAS算法进行检测时,无法检测出A的值是否经历过被修改为B,又再次被修改为A的过程。
2023-04-08 15:09:53
868
原创 如何理解Lock
JDK层面提供了Lock锁都是通过Java提供的接口来手动解锁和释放锁的,所以在某种程度上,JDK中提供的Lock锁也叫显示锁、JDK提供的显示锁位于java.util.concurrent.locks包下,Lock接口的源码如下:lock()方法:阻塞模式抢占锁的方法。如果当前前程抢占锁成功,则继续向下执行程序的业务逻辑,否则,当前线程会阻塞。直到其他抢占到锁的线程释放锁后再继续抢占锁。lockInterruptibly()方法:可中断模式抢占锁的方法,当前线程在调用lockInterruptibl
2023-04-05 21:21:46
357
原创 如何理解AQS
这里需要结合acquireQueued()方法理解,当线程被唤醒后,会进入acquireQueued()方法中的if(p==head && tryAcquier(arg))逻辑判断,当条件成立是,被唤醒的线程会将自己所在的节点设置为head,表示已经获取到资源,此时,acquire()方法也执行完毕了。如果CAS操作设置成,则唤醒队列中的后继结点。在同步队列中,如果当前线程获取资源失败,就会通过addWaiter()方法将当前线程放入队列的尾部,并且保持自旋的状态,不判断自己所在的节点是否是队列的头结点。
2023-03-24 21:30:06
910
原创 如何理解Synchronized
synchronized是基于JVM中的monitor锁实现的,jdk1.5版本之前的synchronized锁性能较低,但是从jdk1.6版本开始,对synchronized锁进行了大量的优化,引入了锁粗化,锁消除,偏向锁,轻量级锁,适应性自旋等技术来提升synchronized锁的性能。无论synchronized修饰方法,还是修饰代码块,底层都是通过JVM调用操作系统的Mutex锁实现的,当线程被阻塞时会被挂起,等待CPU重新调度,这会导致线程在操作系统的用户态和内核态之间切换,影响程序的执行性能。
2023-03-22 18:14:50
326
原创 Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct..........
测试服务器接口遇到的问题,记录下翻译是嵌套异常为com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造“com.chilwe.dtos.socket.down.FivePower”的实例(不存在类似默认构造函数的创建者):无法从Object值反序列化(不存在基于委托或属性的创建者)原因是我在该实体类中添加了一个为了方便实例化该类用的构造函数,导致JVM不会添加默认的无参构造函数,而jackson的反序列化需要无参构造函数,因此报
2023-02-06 18:35:45
4225
原创 Windows 本地启动rocketmq报错-找不到或无法加载主类
记录下,windows安装rocketmq,启动mqbroker.cmd报错错误: 找不到或无法加载主类 Files\Java\jdk1.8.0_321\lib\dt.jar;C:\Program解决方法找到安装rocketmq的安装路径bin目录下的runbroker.cmd文件打开使用英文双引号包起来再重启就好了...
2022-07-01 16:22:32
1899
2
原创 java.lang.OutOfMemoryError: Java heap space
项目部署在服务器上,上传图片的时候出现的问题记录下问题:java.long.OutOfMemoryError:java heap space(系统内存不足)修改启动参数
2022-06-29 11:05:11
651
原创 http常见的状态码
100 客户端应当继续发送请求101:服务器根据客户端的请求切换协议,主要用于websocket或http2升级200(成功):请求已成功,请求所希望的响应头或数据体将随此响应返回201(已创建):请求成功并且服务器创建了新的资源202(已创建):服务器已经接收请求,但尚未处理203(非授权信息):服务器已成功处理请求,但返回的信息可能来自另一来源204(无内容):服务器成功处理请求,但没有返回任何内容205(重置内容):服务器成功处理请求,但没有返回任何内容..
2022-02-28 22:47:04
93
工行icbc对接demo
2023-05-17
jdkapi1.8.rar
2021-03-29
比较实在的五子棋.cpp
2020-06-03
诊所信息管理系统.cpp
2020-04-19
c++分数计算器课程大作业.rar
2019-12-19
关于hibernate的查询,事务概念,复杂表的关系
2018-06-22
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人