- 博客(54)
- 收藏
- 关注
原创 java中String、StringBuffer、StringBuilder的区别和联系
都是用于处理字符串的类,但它们在性能、线程安全和适用场景上有显著区别。频繁修改会导致大量临时对象,降低性能(尤其是循环操作时)。对象一旦创建,其内容不可修改。所有看似修改的操作(如。减少扩容次数(默认容量为 16,扩容代价高)。由于同步锁,单线程环境下性能低于。修饰,保证多线程环境下的安全。即使性能略低,但能避免并发问题。),修改时直接在原对象上操作。方法未加锁,适用于单线程环境。不可变性天然保证线程安全。类似,基于可变字符数组。在单线程环境下,性能比。内部维护可变字符数组(
2025-04-01 10:53:28
584
原创 java中为什么需要同时重写 equals 和 hashCode
这是为了确保对象在哈希表中行为一致,并遵守 Java 的相等性契约。忽略这一点会导致程序出现隐蔽的逻辑错误,尤其在依赖哈希结构的场景下。,这是为了确保对象在哈希表中行为一致,并遵守 Java 的相等性契约。忽略这一点会导致程序出现隐蔽的逻辑错误,尤其在依赖哈希结构的场景下。如果违反这一规则,对象在使用哈希表(如。如果违反这一规则,对象在使用哈希表(如。方法,这是因为两者共同维护了对象的。方法的类通常也需要重写。)时会出现逻辑错误。)时会出现逻辑错误。
2025-04-01 10:42:56
845
原创 什么是动态代理?动态代理和静态代理的区别
静态代理适合简单场景,但代码冗余。动态代理通过反射或字节码技术动态生成代理类,灵活且高效。JDK 动态代理基于接口,CGLIB基于继承,根据需求选择合适方式。
2025-03-31 21:28:07
828
原创 什么是索引下推和索引覆盖?
核心思想:在存储引擎层(如 InnoDB)提前过滤数据,减少不必要的回表操作。通俗解释:假设你有一个联合索引,查询时部分条件可以直接在索引层过滤掉不符合条件的记录,而不是把数据全部交给 MySQL 服务层再过滤。核心思想:查询所需的所有列都包含在索引中,无需回表查询主键索引。通俗解释:就像查字典时,你要查的单词和解释都在目录里,不需要翻到正文页。比喻:快递分拣员在仓库里直接扔掉不符合条件的包裹(如收件地址错误),而不是把所有包裹送到分拣中心再处理。核心。
2025-03-28 20:44:11
817
原创 什么是CAP理论
CAP理论是分布式系统设计中的核心理论之一,由计算机科学家Eric Brewer在2000年提出,后经Nancy Lynch等人证明。它阐述了分布式系统在面临网络分区时必须在三个关键特性之间做出权衡。提出,指出在分布式系统中,
2025-03-25 09:13:55
847
原创 mysql进阶(innodb、索引、类型、权限)
当字段类型为字符串(varchar, text等)时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘IO,影响查询效率,此时可以只降字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。前缀长度:可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值,索引选择性越高则查询效率越高,唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。InnoDB 的指针占用6个字节的空间,主键假设为bigint,占用字节数为8.
2025-03-20 14:37:54
1106
原创 mysql基础(超详细)
mysql基础入门DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段)DML: 数据操作语言,用来对数据库表中的数据进行增删改DQL: 数据查询语言,用来查询数据库中表的记录DCL: 数据控制语言,用来创建数据库用户、控制数据库的控制权限
2025-03-20 14:32:02
763
原创 网络编程中的黏包和半包问题
在网络编程中,黏包和半包问题是常见的数据传输问题,尤其是在使用TCP协议时。Netty作为一个高性能的网络框架,提供了多种解决方案来处理这些问题。下面我将详细解释黏包和半包问题,以及Netty中如何处理它们。如果上述解码器无法满足需求,Netty还允许用户自定义解码器。用户可以继承或来实现自己的解码逻辑。@Override// 自定义解码逻辑黏包和半包问题是TCP协议中常见的数据传输问题,Netty提供了多种解码器来处理这些问题。
2025-03-19 16:31:14
611
原创 springboot中@PostConstruct注解使用详解
是 Spring 中用于在 Bean 初始化完成后执行一些初始化逻辑的注解。它通常用于在依赖注入完成后执行一些必要的初始化操作,如资源加载、配置初始化等。相比于其他初始化方式,更加简洁直观,推荐在大多数场景下使用。
2025-03-19 16:30:00
776
原创 在文件夹下快速创建vue项目搭建vue框架详细步骤
说明你使用的是老的淘宝镜像:registry.npm.taobao.org 后竟然出现证书过期,网上一搜才知道原来的 registry.npm.taobao.org 已替换为 registry.npmmirror.com 地址了,并且看了很多类似报错发现使用的还是老地址。回车后勾选以上3个选项(空格键勾选),并取消勾选Linter(对语法很严格)这个选项,回车。先执行cd springboot_vue 进入该目录,执行dir可以查看该目录。输入yes后选择In package.json的打包方式。
2025-03-19 16:28:14
545
原创 mysql索引
当字段类型为字符串(varchar, text等)时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘IO,影响查询效率,此时可以只降字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。前缀长度:可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值,索引选择性越高则查询效率越高,唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。算出n约为1170。联合索引中,出现范围查询(<, >),范围查询右侧的列索引失效。
2025-03-06 15:15:57
641
原创 MySql详细教程-从入门到进阶(超实用)
- DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段)- DML: 数据操作语言,用来对数据库表中的数据进行增删改- DQL: 数据查询语言,用来查询数据库中表的记录- DCL: 数据控制语言,用来创建数据库用户、控制数据库的控制权限
2024-12-26 20:36:57
1427
原创 mysql进阶
当字段类型为字符串(varchar, text等)时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘IO,影响查询效率,此时可以只降字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。前缀长度:可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值,索引选择性越高则查询效率越高,唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。InnoDB 的指针占用6个字节的空间,主键假设为bigint,占用字节数为8.
2024-12-26 20:31:35
896
原创 mysql基础快速入门
mysql基础快速入门- DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段)- DML: 数据操作语言,用来对数据库表中的数据进行增删改- DQL: 数据查询语言,用来查询数据库中表的记录- DCL: 数据控制语言,用来创建数据库用户、控制数据库的控制权限
2024-12-26 20:26:24
1072
原创 SpringBoot 中的 AOP 切面编程
切面是 AOP 的核心概念,它包含了通知(Advice)和切点(Pointcut)。通知定义了在切点执行的逻辑,而切点定义了在哪些地方应用通知。切点定义了在哪些方法上应用通知。可以使用@Pointcut// 定义一个切点,匹配所有以 "find" 开头的方法 @Pointcut("execution(* com.example.demo.service.*.find*(..))") public void findMethods() {} }
2024-12-23 17:19:31
1194
原创 SpringBoot中使用AOP切面编程实现登录拦截
以上提供的示例代码逻辑大致为用户登录后根据UUID生成一个token,接着将token作为唯一标识键存入redis缓存中,值为用户id,之后可以根据用户请求头中的token去redis中获取用户id,当然你也可以根据自己的实际需求来。
2024-12-23 17:03:04
670
原创 netty高级-优化与源码
注意发送的数据未必能够一次读完,因此会触发多次 nio read 事件,一次事件内会触发多次 pipeline read,一次事件会触发一次 pipeline read complete。SO_TIMEOUT 主要用在阻塞 IO,阻塞 IO 中 accept,read 等都是无限等待的,如果不希望永远阻塞,使用它调整超时时间。在 linux 2.2 之前,backlog 大小包括了两个队列的大小,在 2.2 之后,分别用下面两个参数来控制。主要任务是执行死循环,不断看有没有新任务,有没有 IO 事件。
2024-12-22 18:04:57
895
原创 springboot中@PostConstruct注解使用详解
是 Spring 中用于在 Bean 初始化完成后执行一些初始化逻辑的注解。它通常用于在依赖注入完成后执行一些必要的初始化操作,如资源加载、配置初始化等。相比于其他初始化方式,更加简洁直观,推荐在大多数场景下使用。
2024-12-22 16:31:06
1806
原创 网络编程中的黏包和半包问题
在网络编程中,黏包和半包问题是常见的数据传输问题,尤其是在使用TCP协议时。Netty作为一个高性能的网络框架,提供了多种解决方案来处理这些问题。下面我将详细解释黏包和半包问题,以及Netty中如何处理它们。如果上述解码器无法满足需求,Netty还允许用户自定义解码器。用户可以继承或来实现自己的解码逻辑。@Override// 自定义解码逻辑黏包和半包问题是TCP协议中常见的数据传输问题,Netty提供了多种解码器来处理这些问题。
2024-12-17 19:15:19
1081
原创 netty进阶以及基于netty聊天室demo案例
魔数,用来在第一时间判定是否是无效数据包版本号,可以支持协议的升级序列化算法,消息正文到底采用哪种序列化反序列化方式,可以由此扩展,例如:json、protobuf、hessian、jdk指令类型,是登录、注册、单聊、群聊… 跟业务相关请求序号,为了双工通信,提供异步能力正文长度消息正文/*** 用户管理接口/*** 登录* @param username 用户名* @param password 密码* @return 登录成功返回 true, 否则返回 false。
2024-12-17 19:08:05
1053
原创 Netty入门教程——认识Netty
我们知道,Java的内存有堆内存、栈内存和字符串常量池等等,其中堆内存是占用内存空间最大的一块,也是Java对象存放的地方,一般我们的数据如果需要从IO读取到堆内存,中间需要经过Socket缓冲区,也就是说一个数据会被拷贝两次才能到达他的的终点,如果数据量大,就会造成不必要的资源浪费。NIO和BIO的区别主要是在第一步。多路复用IO,他的两个步骤处理是分开的,也就是说,一个连接可能他的数据接收是线程a完成的,数据处理是线程b完成的,他比BIO能处理更多请求。原因就是图二中出现的。
2024-12-06 19:55:10
1285
原创 Netty入门(快速了解以及使用netty)
Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端。Netty 在 Java 网络应用框架中的地位就好比:Spring 框架在 JavaEE 开发中的地位以下的框架都使用了 Netty,因为它们有网络通信需求!Cassandra - nosql 数据库 Spark - 大数据分布式计算框架 Hadoop - 大数据分布式存储框架 RocketMQ - ali 开源的消息队列 ElasticSearch - 搜索引擎 gRPC
2024-12-06 19:51:00
4269
3
原创 java NIO(non-blocking io 非阻塞 IO)知识精讲
non-blocking io 非阻塞 IOchannel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前的 stream 要么是输入,要么是输出,channel 比 stream 更为底层channelbuffer常见的 Channel 有buffer 则用来缓冲读写数据,常见的 buffer 有selector 单从字面意思不好理解,需要结合服务器的设计演化来理解它的用途socket1t
2024-11-29 19:33:33
2225
原创 github如何将前后端代码以及其他文件放进一个分支流程
通过以上步骤,你可以将前后端代码放在同一个GitHub分支中,并且可以通过目录结构来清晰地组织代码。这种方式适合小型项目或需要快速迭代的项目。对于大型项目,可能需要考虑使用多个分支或子模块来更好地管理代码。你可以使用GitHub Actions或其他CI/CD工具来设置自动化测试和部署流程。首先,在GitHub上创建一个新的仓库。你可以选择创建一个空的仓库,或者使用一个模板仓库。文件,描述项目的结构和如何运行前后端代码。在项目根目录下,你可以分别运行前端和后端代码。文件,忽略不需要的文件和目录(如。
2024-11-23 17:03:44
448
原创 初识netty-netty快速入门
WebSocket 是一种在客户端和服务器之间建立持久连接的协议,允许双向、全双工的通信,避免了传统 HTTP 请求响应模式的高开销。WebSocket 协议通过握手建立连接,在连接建立后,可以持续发送和接收数据,适合实时应用,如聊天、在线游戏、股票行情等。@Overridelogger.info("心跳超时");@Slf4j@Component/*** 用于处理每个传入的消息。
2024-11-19 09:41:58
4283
原创 2024最新将本地项目jar包发布上传到maven私服中央仓库以及踩坑记录(看这一篇就够了)-超详细
配置好maven后使用idea的maven工具进行deploy工作,这个时候回弹出让你输入gpg密码(只有第一次进行这个操作回有,后面就不需要输入密码了),只要输入你刚刚生成签名时设置的密码就行了。此处executable填写你的gpg文件路径,只需要修改F:\gpg\GnuPG这一段就好了,后面\bin\gpg.exe是一样的。此处name填写你的项目名,description填写的项目描述,url填写你的仓库地址就可以了。基本说明你的系统有问题,建议换一个用户登录,没有的可以以管理员身份注册一个用户。
2024-10-29 09:12:30
9644
4
原创 springboot中通过jwt令牌校验以及前端token请求头进行登录拦截实战
Slf4j@Autowired/*** 注册自定义拦截器*/log.info("开始注册自定义拦截器...");.addPathPatterns("/user/**") //表示拦截所以前缀带/user的请求//排除特定路径:excludePathPatterns("/user/login") 方法用于排除某些路径,//即使它们匹配前面指定的模式。在这个例子中,/user/login 路径不会被 jwtTokenAdminInterceptor 拦截。/*** 设置静态资源映射。
2024-07-10 15:45:51
3927
2
原创 RabbitMQ高级-rabbitMQ消息队列高级部分笔记
每个只能配置一个,因此我们可以在配置类中统一设置。我们在publisher模块定义一个配置类:内容如下:@Slf4j@Overridelog.error("触发return callback,");});由于每个消息发送时的处理逻辑不一定相同,因此ConfirmCallback需要在每次发消息时定义。具体来说,是在调用RabbitTemplate中的convertAndSend方法时,多传递一个参数:id。
2024-06-02 16:51:49
711
原创 RabbitMq消息队列最新笔记
多个消费者绑定到一个队列,同一条消息只会被一个消费者处理通过设置prefetch来控制消费者预取的消息数量交换机的作用是什么?接收publisher发送的消息将消息按照规则路由到与之绑定的队列不能缓存消息,路由失败,消息丢失FanoutExchange的会将消息路由到每个绑定的队列描述下Direct交换机与Fanout交换机的差异?Fanout交换机将消息路由给每一个与之绑定的队列Direct交换机根据RoutingKey判断路由给哪个队列。
2024-06-01 20:45:22
790
原创 写后端项目时上传文件接口使用阿里云oss-规范写法
验证后会给你一个AccessKey ID和AccessKey Secret,把他复制好记录在记事本上。在对象存储oss创建Bucket列表,详细流程去网上可以看教程。写入OssConfiguration 创建oss对象。在这里写你刚刚复制的id和secret。接下来就可以根据请求路径上传文件了。
2024-05-15 14:36:54
457
原创 三更草堂前后端分离个人博客项目的开发笔记
我们有前台和后台两套系统。两套系统的前端工程都已经提供好了。所以我们只需要写两套系统的后端。 但是大家思考下,实际上两套后端系统的很多内容是可能重复的。这里如果我们只是单纯的创建两个后端工程。那么就会有大量的重复代码,并且需要修改的时候也需要修改两次。这就是代码复用性不高。 所以我们需要创建多模块项目,两套系统可能都会用到的代码可以写到一个公共模块中,让前台系统和后台系统分别取依赖公共模块。① 创建父模块②创建公共子模块 sangeng-framework③创建博客后台模块sangeng-adm
2024-05-13 20:30:50
900
原创 java后端解决跨域问题常用配置类
在开发前后端分离项目时从前端调用后台请求常常无法响应,这是因为浏览器存在一个跨域问题,只需要添加一个config配置类。
2024-05-11 21:09:01
237
1
原创 Linux实操之常用指令详解
Linux 系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统在 linux 中的每个用户必须属于一个组,不能独立于组外。在 linux 中每个文件有所有者、所在组、其它组的概念。所有者所在组其它组改变用户所在的组文件/目录 所有者一般为文件的创建者,谁创建了该文件,就自然的成为该文件的所有者。查看文件的所有者指令:ls –ahl修改文件所有者指令:chown 用户名 文件名应用案例。
2024-05-07 20:40:10
1141
2
原创 renren-fast开源快速开发代码生成器
renren-fast是一个轻量级的Spring Boot快速开发平台,能快速开发项目并交付.完善的XSS防范及脚本过滤,彻底杜绝XSS攻击实现前后端分离,通过token进行数据交互。
2024-05-07 20:21:29
3741
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人