自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 我的创作纪念日

写过的每一行代码都是最好的代码。

2024-02-19 10:10:20 419

原创 使用Thumbnailator遇到异常:No suitable ImageReader found for source data

引入依赖后可能会解决第一种webp的问题,第二种问题依然无法解决,所以往往最普通的办法就是最使用的办法,这里通过最原始的流获取字节数组,将该字节数组读出到输出流并转换成字符串就是该二进制文件中所有的内容,即与原部分数据一致。base64,中截取image/jpeg。最后再使用new MockMultipartFile(),将字节数组转化为MultipartFile对象。通过java原生的Base64.getDecoder().decode(),转换成字节数组的形式,再将data:image/jpeg;

2024-01-30 14:44:16 1243 1

原创 Java中的日期类

Date、Calendar和LocalDateTime在Java中都是用于处理日期和时间的类,但它们之间存在一些区别。Date:这是Java 1.0提供的一个类,用于表示特定的时间点。它包含年、月、日、时、分、秒、毫秒的信息。然而,Date类在某些方面存在一些问题,例如它的线程安全性和对时区的处理方式。Calendar:这是Java 1.1提供的一个类,用于处理日期和时间。它提供了一种灵活的方式来表示和操作日期和时间。

2023-12-22 16:34:55 1055

原创 java.lang.UnsupportedOperationException分析及解决

这里从UnmodifiableList的源码来分析:除了equals、hashCode、get、indexOf、lastIndexOf等方法外,其他方法都会抛出UnsupportedOperationException()异常,而这些方法的共同点都是返回该list的属性,说明UnmodifiableList是一个只读的集合,因此对这个List不能进行添加或删除元素等操作。如果需要将list转化为不可变的集合,Collections也提供了这样的方法,最终转化为UnmodifiableList。

2023-12-21 10:47:57 6795

原创 SQL进阶 | 外连接

SQL 不是用来生成报表的语言,所以不建议用它来进行格式转换。必要时考虑用外连接或 CASE 表达式来解决问题。生成嵌套式表侧栏时,如果先生成主表的笛卡儿积再进行连接,很容易就可以完成。从行数来看,表连接可以看成乘法。因此,当表之间是一对多的关系时,连接后行数不会增加。外连接的思想和集合运算很像,使用外连接可以实现各种集合运算。

2023-12-14 11:02:15 1441

原创 SQL进阶 | HAVING子句

表不是文件,记录也没有顺序,所以 SQL 不进行排序。SQL 不是面向过程语言,没有循环、条件分支、赋值操作。SQL 通过不断生成子集来求得目标集合。SQL 不像面向过程语言那样通过画流程图来思考问题,而是通过画集合的关系图来思考。GROUP BY 子句可以用来生成子集。WHERE 子句用来调查集合元素的性质,而 HAVING 子句用来调查集合本身的性质。

2023-12-13 10:27:54 5331

原创 SQL进阶 | 三值逻辑与NULL

NULL 不是值。因为 NULL 不是值,所以不能对其使用谓词。对 NULL 使用谓词后的结果是 unknown。unknown 参与到逻辑运算时,SQL 的运行会和预想的不一样。解决 NULL 带来的各种问题,最佳方法应该是往表里添加 NOT NULL 约束来尽力排除 NULL。

2023-12-12 11:14:48 1523

原创 SQL进阶 | 自连接

自连接经常和非等值连接结合起来使用。自连接和 GROUP BY 结合使用可以生成递归集合。将自连接看作不同表之间的连接更容易理解。应把表看作行的集合,用面向集合的方法来思考。自连接的性能开销更大,应尽量给用于连接的列建立索引。

2023-12-11 15:43:15 3851 2

原创 SQL进阶 | CASE表达式

SQL中的CASE表达式是一种通用的条件表达式,类似于其他语言中的if/else语句。它用于在SQL语句中实现条件逻辑。CASE表达式以WHEN子句开始,后面跟着一个或多个WHEN条件,每个WHEN条件后面跟着一个THEN子句。如果任何WHEN条件为真,则返回相应的THEN子句中的表达式。如果没有任何WHEN条件为真,则可以选择性地使用ELSE子句来指定一个默认的表达式。-- 简单 CASE 表达式CASE sexWHEN '1' THEN '男'WHEN '2' THEN '女'

2023-12-08 17:10:19 5560

原创 还记得当初自己为什么选择计算机?

在大三快结束时,我的规划也从考研转为了就业,这些年的考研人数逐渐递增,越来越卷,考研的压力也越来越大,再加上当时的计算机环境也还不错,就业相对容易一点,更有把握一点,于是开始准备22秋招,目标岗位Java后端工程师,很幸运在秋招收获了相对较好的几个offer,但当时眼高手低觉得还有更好的机会,便想着23春招再战,可就从今年开始,Java市场饱和,找工作越来越难,再加上个人一些原因,春招在仅有的几个offer之间,放弃了高薪资的外地offer,留在了本地实习,大四毕业前,这份实习工作也在2个月就辞职了。

2023-12-06 15:19:48 422

原创 当发送“Hello,World”时,channel发生了什么?

Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端。

2023-12-05 17:12:04 1062

原创 MybatisPlus中的使用Wrapper自定义SQL

需要版本 >=3.0.7param 参数名要么叫ew,要么加上注解使用不支持Wrapper内的entity生成where语句。实例MySQL数据库中表内容如下:User实体类@DataUserMapper接口// 使用 QueryWrapper 自定义update// 使用 LambdaQueryWrapper 自定义update// 使用 LambdaQueryWrapper 自定义selectemail

2023-12-05 10:09:40 3564

原创 网络编程NIO中的阻塞与非阻塞

在NIO多路复用中,当一个线程调用选择器的select()方法时,选择器会阻塞等待,直到有已注册的通道就绪(可以执行读或写操作)。然后选择器会返回一个就绪通道的集合,线程可以遍历这个集合,对每个就绪的通道执行相应的IO操作。这样,一个线程就可以同时处理多个网络连接,提高了处理能力和并发性。非阻塞模式下,线程要执行I/O操作时,只需在等待操作完成期间保持响应,处理其他任务。阻塞模式下,线程要执行I/O操作时,必须等待I/O操作完成,才能向下运行。异步:线程自己不去获取结果,由其他线程去获取。

2023-12-01 08:17:39 600

原创 如何修改docker容器中的MySQL数据库的密码?

修改docker容器中的MySQL数据库的密码

2023-11-04 20:46:17 721

原创 SQL表连接中如何根据条件不同关联不同的字段

使用case when end 写法,每一个case代表一种场景,根据场景的不同,选择不同的关联字段即可解决。使用SUBSTRING_INDEX(str,delim,count)进行字段的截取。count:序号,为非0整数。若为整数则表示从左到右数,若为负数则从右到左数。delim:分隔符,string存在且用于分割的字符,比如“,”、“.”等。为分隔符结尾的子字符串,为“固定资产-行政设备”;为分隔符结尾的子字符串,截取结果为“行政设备”。string:用于截取目标字符串的字符串。

2023-04-04 16:08:16 1686 1

原创 JavaScript常用事件详解

HTML 事件是发生在 HTML 元素上的事情。当在 HTML 页面中使用 JavaScript 时, JavaScript 可以触发这些事件。

2022-11-18 16:28:12 165 2

原创 Spring框架中@Autowired实现自动装配的过程

Spring框架在很大程度上为程序业务开发降低了耦合关系,@Autowired自动装配就是Spring IOC和DI核心思想的体现,通过将对象的控制权转交给Spring框架,由IOC容器在运行时向每个bean对象注入所依赖的另一个bean对象,从而实现自动装配。

2022-10-24 22:32:22 2306 1

原创 TCP协议的拥塞控制

TCP协议是一个面向连接的、可靠的传输层协议,当网络拥塞时,为了保证它的可靠性传输,TCP协议使用拥塞控制来减少数据的发送。TCP协议进行拥塞控制的算法有四种:慢开始、拥塞避免、快重传、快恢复。当然,在拥塞控制的过程中,必须得提到拥塞窗口,这是拥塞控制中不可或缺的一个状态变量,而发送方维持着这个窗口,其值取决于网络的拥塞程度,并且动态变化,只要网络没有出现拥塞,拥塞窗口就扩大一点,但是只要网络中出现拥塞,拥塞窗口就减小。

2022-10-08 19:35:51 1256

原创 TCP与UDP的区别

TCP协议首部格式包括源端口(2个字节)、目的端口(2个字节)、序号(4个字节)、确认号(4个字节)、数据偏移(4bit)、保留(4bit)、控制位(1个字节)、窗口(2个字节)、校验和(2个字节)、紧急指针(2个字节)、选项、填充,由于数据偏移量最大是1111,单位是4个字节,所以TCP首部长度最小是20字节,最大是60字节;UDP协议首部格式包括源端口(2个字节)、目的端口(2个字节)、长度(2个字节)、检验和(2个字节),所以UDP首部长度是8字节;UDP协议适合通信速度快的场景,比如音频、视频等;

2022-09-22 19:43:40 885

原创 浏览一个网站时的整个过程

在HTTP/1.0版本,建立短连接,每请求一次就建立一次TCP连接,在HTTP/1.1,更改为建立长连接,即只需要建立一次TCP连接就能进行多次HTTP通信。服务器收到浏览器的请求,此时不关闭连接,继续向浏览器发送还未完成的报文,控制位:FIN=0,ACK=1;服务器发送完报文后,同意关闭连接,继续向浏览器发送报文,控制位:FIN=1,ACK=1;客户端收到浏览器同意连接的报文段,再向浏览器发送一个报文段,控制位:ACK=1;浏览器接收到客户端的请求,同意连接,控制位:SYN=1,ACK=1;

2022-09-22 19:05:11 277

原创 CopyOnWriteArrayList源码分析

CopyOnWriteArrayList是一个线程安全的集合,当我们对集合容器使用增删改操作时,并不是直接对方法进行加锁,在原集合进行操作,而是通过复制出一个新集合,然后在新集合中进行操作,操作结束后,将原集合容器的引用指向新的集合容器,所以他能实现写入时的线程安全,但不影响并发的读取操作,所以适用于读多写少的场景,是一种读写分离的思想。但是由于每个操作都需要拷贝原集合,数据较大的时候容易引起频繁Full GC;而且写和读在不同的Object[]数组上,容易引起数据不一致的问题。

2022-09-18 11:43:41 247

原创 创建对象在堆区如何分配内存

JVM虚拟机在创建对象时的执行流程

2022-09-18 10:56:54 202

原创 Java线程中的ThreadLocal

ThreadLocal在底层是使用Thread类中的ThreadLocalMap来存取数据的,每一个线程都拥有一个ThreadLocalMap,在ThreadLocalMap的内部包含了一个Entry数组,每个Entry对象的key为当前线程的ThreadLocal对象,value为存储的数据。如果业务代码出现异常,也能及时清理没用的数据。ThreadLocal也叫做线程局部变量,它是用来在线程中保存数据的,保存的数据也只属于当前线程,并且是该线程中独有的变量。

2022-09-16 18:33:46 434 1

原创 Java中的锁

获取锁是通过线程抢占的形式,并且只支持非公平锁,在方法执行结束自动释放锁。ReentrantLock实现了Lock接口,在获取锁、释放锁时必须手动使用lock()、unlock()方法,并且支持公平锁和非公平锁,默认情况下使用非公平锁,相比于synchronized,可以通过tryLock()尝试获取锁,性能更安全,并且提供了大量更高级的并发功能,能大大简化多线程程序的编写。是否已经指向当前线程的栈帧,如果指向,则继续执行,否则,标志位变成10,升级成重量级锁,其他等待线程阻塞,当前线程自旋尝试获取锁。

2022-09-14 20:21:40 290

原创 Java中的线程池(总结)

当队列中没有数据的情况下,消费者端的所有线程都会被自动阻塞(挂起),直到有数据放入队列,当队列中数据存满内存空间时,生产者端的所有线程会被自动阻塞,在保证并发安全的同时,提高了队列的存取效率。在java中使用多线程执行任务,由于每个线程都要进行创建和销毁,导致性能和内存上的开销都非常大,而导致资源不足,所以使用线程池,每次创建时都从线程池中获取,等线程任务执行结束,又回收到线程池中,减少创建和销毁的次数,能一定程度上提高效率,并且可以有效地对线程进行统一的管理监控。如果有新任务,就分配一个空闲线程执行。

2022-09-14 09:09:11 338

原创 Session会话追踪的实现机制

前面我们学习了Servlet的生命周期,每次访问Servlet时,都要经历实例化、初始化、服务、销毁四个阶段。那么当然,实例化、初始化、销毁这三个阶段只执行在服务器启动和关闭阶段,所以,我们可以简单的理解为,从服务器启动到停止对服务器的访问就是一个会话,从客户端的角度来讲,从用户访问浏览器到关闭浏览器的这一过程就是一个会话,那么如果有多个用户访问一个浏览器,浏览器怎么区分谁是谁呢?这就需要SessionID来起作用了。

2022-08-25 11:32:11 194

原创 Servlet的生命周期

Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性, 是运行在 Web 服务器或应用服务器上的程序。和JDBC一样,Servlet同样是作为JavaEE规范的一项技术、接口、规范,他不能直接和客户端进行交互而是部署在一个容器中,像我们熟知的Tomcat容器,由这个容器来实现Servlet的接口,从而能和客户端进行交互。

2022-08-20 18:22:19 324

原创 MyBatis学习中遇到的问题

这里我定义了resultMap自定义结果集来处理一对多的查询结果,但是在返回类型这里,我用了resultType,并没有使用resultMap,resultType="com.apesource.entity.Department这就导致本来应该存放在1个集合里面的2条数据,变成了2个单独的实体,解决办法:把 resultType="com.apesource.entity.Department 改成resultMap="departmentResultMap"......

2022-08-15 20:08:13 604

原创 当添加一个键值对元素时,HashMap发生了什么?

HashMap内部数据结构使用数组+链表+红黑树进行存储。数组类型为Node[],每个Node都保存了某个KV键值对元素的key、value、hash、next等值。由于next的存在,所以每个Node对象都是一个单向链表中的组成节点。...

2022-08-13 17:41:31 188

原创 Java使用传统JDBC操作数据库

JDBC是Java DataBase Connectivity的缩写,它是Java程序访问数据库的标准接口。使用Java程序访问数据库时,Java代码并不是直接通过直接建立TCP连接去访问数据库,而是通过JDBC接口来建立连接,而JDBC接口则通过JDBC驱动来实现真正对数据库的访问。在JDBC驱动实现类中,通过建立TCP连接来建立真正的网络通讯连接。...

2022-08-10 19:56:28 1601

原创 JavaScript常用正则表达式

2、可以输入英文,可以有空格,可以输入英文名字中的点;1、不能有特殊字符和数字;4、中文英文不能同时出现;正则.test(数据)5、长度在1-20;

2022-08-10 11:28:24 1211

原创 Java基于FTP协议的文件上传与下载

FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。在开发网站的时候,通常利用FTP协议把网页或程序传到Web服务器上。此外,由于FTP传输效率非常高,在网络上传输大的文件时,一般也采用该协议。.........

2022-08-06 15:02:03 850

原创 Java中如何使用反射实现动态代理?

了解反射之前,先来了解Java中的两个概念编译期和运行期。编译期是指把源码交给编译器编译成计算机可以执行的文件的过程。在Java中也就是把Java代码编成class文件的过程。编译期只是做了一些翻译功能,并没有把代码放在内存中运行起来,而只是把代码当成文本进行操作。比如检查语法错误。运行期是把编译后的文件交给计算机执行,直到程序运行结束。所谓运行期就把在磁盘中的代码放到内存中执行起来。是Java程序开发语言的特征之一,它允许1.在运行时获取任意一个对象所属的类。...

2022-07-27 21:23:32 1679

原创 Java中的加密与安全(总结篇)

什么是编码?我们可以理解为我们日常使用的文字就是一种编码,比如我们把中文翻译成英文就是一种编码的过程,懂得魔方盲拧原理的同学把魔方的色相,位置转换成英文字母也是一种编码,当然,这些都是建立在特殊的编码规则里面的。那么在计算机中,同样存在编码,我们比较熟知的就有等。ASCII编码中通过8位二进制数存储了大小写的英文字母,数字,特殊字符,但由于只有127个字符,不能对更多的文字进行编码,所以就用到了2个字节值的Unicode编码,和占用3个字节值的UTF-8编码,当然还有更多,这里暂时就不作以解释了。。....

2022-07-22 18:21:15 3066 3

原创 Java中使用HTTP编程实现网络爬虫

HTTP协议(超文本传输协议,HyperTextTransferProtocol),是一种无状态的协议,它是基于TCP协议的应用层传输协议,简单的来说,HTTP协议属于应用层,建立在传输层协议TCP之上。客户端通过与服务器建立TCP连接,之后发送HTTP请求与接收HTTP响应都是通过访问Socket接口来调用TCP协议实现。当我们使用浏览器访问模拟服务器时,控制台会获取当前连接的信息,也就是请求头HTTPHeader和请求体BodyHost响应的第一行总是HTTP版本响应代码响应说明。...

2022-07-18 19:24:02 757

原创 Java中的邮件发送——Java Email

电子邮件是一种用电子手段提供信息交换的通信方式,是互联网应用最广的服务。通过网络的电子邮件系统,用户可以以非常低廉的价格(不管发送到哪里,都只需负担网费)、非常快速的方式(几秒钟之内可以发送到世界上任何指定的目的地),与世界上任何一个角落的网络用户联系。电子邮件可以是文字、图像、声音等多种形式。同时,用户可以得到大量免费的新闻、专题邮件,并轻松实现轻松的信息搜索。电子邮件的存在极大地方便了人与人之间的沟通与交流,促进了社会的发展。...

2022-07-16 19:27:22 1081 2

原创 Java中的网络编程(TCP与UDP)

Socket是一个抽象的概念,一个应用程序通过Socket建立一个远程连接,而Socket内部通过TCP/IP协议把数据传送至网络。简单的来说,Socket就是套接字,由IP地址和端口号(范围是0~65535)组成,端口号是由操作系统随机分配的,但是小于1024的端口号是特权端口,一般都是需要管理员权限,用户使用时可能会和系统中某个应用程序发送冲突,因此,用户一般能随意使用的端口号都要大于1024。通过端口号,Socket才能正确连接本机中的应用程序。那么如何来使用Socket来进行网络通信呢?...

2022-07-16 18:38:07 672

原创 Java中的文件解析——Excel解析

在日常的开发过程中,经常会使用到excel工作簿进行数据的保存,那么在java中,通常会使用第三方提供的技术来进行excel文件的解析,比如:Apache POI、JXL、Alibaba EasyExcel。本文则使用的是Apache POI。 目前Apache POI用的比较广泛的实现类是XSSFWorkbook(),主要因为当前版本的excel文件大多数都是以“.xlsx”结尾的,XSSFWorkbook()能识别的就是这种文件。当然Apache POI也提供了HSSFWorkbook()

2022-07-12 20:23:26 11254 3

原创 Java中的文件解析——JSON解析

为了实现客户端与服务器之间的数据交换,xml文件可能会成为首选,但是由于xml文件需要太多标签,造成资源上的冗余,因此,就放弃了xml文件,那么第二种可能会选择序列化和反序列化,IO流就是一种代表,实现了从磁盘到内存之间的交互,但是,如果基于不同语言或不同平台,那么序列化进行数据交互就无法实现。由此就出现了JSON,它是基于 ECMAScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

2022-07-11 19:36:39 3769 3

原创 Java中如何读取和写入properties文件

properties文件properties文件是一种属性文件,这种文件以key=value格式存储内容。Java中可以使用Properties类来读取这个文件,一般properties文件作为一些参数的存储,使得代码更加灵活。这里先定义一个data.properties文件,内容如下:cn=12kr=14jp=64既然properties是一个文件,那么我们也可以用FileInputStreram来进行读取: try (BufferedInputStream bis = new

2022-05-30 18:13:35 3449 1

空空如也

空空如也

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

TA关注的人

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