自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

秃头披风侠的博客

记录和分享自己学习到的一些技术

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

原创 拦截器抛出异常无法被全局异常处理器捕获问题

由于默认情况下会打到error,可以将默认返回的页面写到该方法中。如果前后端项目放在一起写,前端项目的访问也由springMVC来控制,那么当访问前端页面时,如果在拦截器preHandle中抛出异常,这个异常并不会被全局异常处理器所捕获,而是会将该错误一直往上抛,最终由org.apache.catalina.core.StandardHostValve#status方法所处理,会默认去访问htpp://localhost/error接口。

2024-04-06 22:06:47 876

原创 第四章、网络层:数据平面

网络层包含数据平面和控制平面两个部分,数据平面负责实际的数据传输和路由,而控制平面则处理路由表的构建和维护,以指导数据平面的操作。

2024-02-01 01:42:02 1361

原创 Java中的锁与锁优化技术

自旋等待本身虽然避免了线程切换的开销,但它是要占用处理器时间的,所以如果锁被占用的时间很短,自旋等待的效果就会非常好,反之如果锁被占用的时间很长,那么自旋的线程只会白白消耗处理器资源,而不会做任何有价值的工作,这就会带来性能的浪费。轻量锁使用操作系统互斥量来实现,轻量级锁并不是用来代替重量级锁的,它设计的初衷是在没有多线程竞争的前提下,减少传统的重量级锁使用操作系统互斥量产生的性能消耗。:当锁的持有者线程执行完同步代码块并释放锁时,Mark Word中的锁信息会被更新,通常是重入次数的减少或锁状态的变更。

2023-10-06 03:01:12 798

原创 第三章、运输层

运输层协议为运行在不同主机上的应用进程之间提供了逻辑通信(logic communication)功能。运输层协议是在端系统中而不是在路由器中实现的。因特网的运输层主要负责端到端的通信。它在网络层之上,应用层之下,为运行在不同主机上的进程提供逻辑通信。运输层的主要协议有两种:传输控制协议 (TCP) 和用户数据报协议 (UDP)。运输层的其他功能包括多路复用和解复用,它允许多个网络应用共享同一网络连接,同时保证数据能正确无误地发送到正确的应用。

2023-10-05 02:25:23 1564

原创 Java内存模型-JMM

每条线程还有自己的工作内存(Working Memory,可以理解为高速缓存),线程的工作内存中保存了被该线程使用的变量的主内存副本,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的数据。先行发生是Java内存模型中定义的两项操作之间的偏序关系,比如说操作A先行发生于操作B,其实就是说在发生操作B之前,操作A产生的影响能被操作B 观察到,“影响”包括修改了内存中共享变量的值、发送了消息、调用了方法等。:内存屏障是一种同步机制,它用于控制内存操作的执行顺序和可见性。

2023-09-22 16:50:42 649

原创 【JVM】类加载器

自定义类加载器是破坏双亲委派模型的最常见方式之一。您可以继承。

2023-09-22 13:19:51 543

原创 【JVM】类加载的过程

client()>()方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static{}块)中的语句合并产生的,编译器收集的顺序是由语句在源文件中出现的顺序决定的,静态语句块中只能访问 到定义在静态语句块之前的变量,定义在它之后的变量,在前面的静态语句块可以赋值,但是不能访问。准备阶段是正式为类中定义的变量(即静态变量,被static修饰的变量)分配内存并设置类变量初始值的阶段,这时候进行内存分配的仅包括类变量,而不包括实例变量。其中,解析是可选的,其他阶段通常都会执行。

2023-09-21 18:06:25 608

原创 java实现十大排序算法

选择排序(Selection Sort)是一种简单的排序算法,它的基本思想是将数组分成已排序和未排序两部分,每次从未排序部分选择最小(或最大)的元素,然后将其放到已排序部分的末尾。堆排序的主要思想是将待排序的数组构建成一个二叉堆(最大堆),然后不断将堆顶元素(最大元素)与堆的最后一个元素交换,然后将堆的大小减一,再对剩余的元素进行堆的调整,使其满足最大堆的性质,重复这个过程直到整个数组排序完成。虽然冒泡排序是一种简单的排序算法,但它的时间复杂度较高,为O(n^2),其中n是待排序元素的数量。

2023-09-19 20:46:06 723

原创 【JVM】经典垃圾收集器

这种“双向”的卡表结构(卡表是“我指向谁”,这种结构还记录了“谁指向我”)比原来的卡表实现起来更复杂,同时由于Region数量比传统收集器的分代数量明显要多得多,因此G1收集器要比其他的传统垃 圾收集器有着更高的内存占用负担。:负责更新Region的统计数据,对各个Region的回收价值和成本进行排序,根据用户所期望的停顿时间来制定回收计划,可以自由选择任意多个Region构成回收集,然后把决定回收的那一部分Region的存活对象复制到空的Region中,再清理掉整个旧Region的全部空间。

2023-09-16 17:21:10 534

原创 HotSpot垃圾收集算法实现细节

在HotSpot里,使用一组称为OopMap的数据结构来存储了对象的地址。,当灰色对象要删除指向白色对象的引用关系时,就将这个要删除的引用记录下来,在并发扫描结束之后,再将这些记录过的引用关系中的灰色对象为根,重新扫描 一次。,当黑色对象插入新的指向白色对象的引用关系时,就将这个新插入的引用记录下来,等并发扫描结束之后,再将这些记录过的引用关系中的黑色对象为根,重新扫描一次。指向白色对象的引用关系时,就将这个新插入的引用记录下来,等并发扫描结束之后,再将这些记录过的引用关系中的黑色对象为根,重新扫描一次。

2023-09-08 16:12:42 458

原创 【JVM】垃圾收集算法

标记-复制算法(Mark and Copy Algorithm)是一种用于垃圾回收的算法,它解决了标记-清除算法中出现的内存碎片问题。标记-整理算法(Mark and Compact Algorithm)是一种用于垃圾回收的算法,通常用于老年代(Old Generation)的内存回收。它是标记-清除算法的改进版本,主要解决了标记-清除算法可能导致的内存碎片问题。标记-清除算法(Mark and Sweep Algorithm)是一种经典的垃圾回收算法,用于识别和释放不再被引用的对象,从而回收内存空间。

2023-09-04 20:15:43 917

原创 【JVM】对象死亡判断

该算法的基本思路就是通过 一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”(Reference Chain),如果某个对象到GC Roots间没有任何引用链相连, 或者用图论的话来说就是从GC Roots到这个对象不可达时,则证明此对象是不可能再被使用的。:一些Java虚拟机实现采用了方法区中的数据的优化技术,可以在运行时进行热替换(HotSwap)或类的动态生成,这些技术可能会导致方法区中的一些数据被回收或替换。

2023-09-03 23:13:33 591

原创 【JVM】运行时数据区域

本地方法指的是用非Java语言(通常是C、C++等)编写的方法,这些方法可以通过Java的本地接口(JNI,Java Native Interface)在Java程序中调用。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。它是一个非常大的内存区域,被所有线程共享。总之,运行时常量池是在类加载后构建的一种数据结构,包含了编译时常量池中的部分内容以及在运行时生成的常量,它为Java程序提供了常量引用和操作的支持。

2023-08-23 02:04:59 708

原创 第二章、应用层

在相同的客户与服务器之间,后续的请求和响应报文能够通过相同的连接进行传送,对对象的这些请求可以一个接一个地发出,而不必等待对未决请求(流水线)的回答。上述图片描述了发送邮件的过程,Alice发送邮件是先发往自己的代理服务器,然后由代理服务器发送到Bob的代理服务器,最终Bob通过某些协议(不能使用SMTP,因为SMTP是推协议,主动获取是一个拉的过程)从自己的代理服务器获取邮件。通过将内容分发到全球各地的服务器,CDN可以显著减少用户在访问内容时的延迟,提供更快速、可靠和高性能的用户体验。

2023-08-21 00:32:42 438

原创 第一章、计算机网络和英特网

英特网是一个世界范围的计算机网络,是一个互联了遍及全世界设备数十亿的网络所有设备都被称为主机或者端系统。端系统通过通信链路和分组交换机连接到一起,最著名的两种交换机类型是路由器和链路层交换机。端系统通过**ISP(英特网服务提供商)**接入因特网,ISP自身就是一个由多台分组交换机组和多端通信链路组成的网络。英特网标准是由英特网工作任务组(Internet Engineering Task Force,ITTF)研发。ITTF的标准文档被称为请求评论(Request For Comment,RFC)。

2023-07-20 00:28:51 570

原创 我的创作纪念日

在学一个东西的时候感觉学会了,其实并没有,只有当你能给别人讲清楚一个技术是什么的时候才是真正学会了,于是就开始了写博客。在学习一个新技术的时候往往会先过一遍,然后在看书或者官方文档总结为自己的博客,这样可以很快的学会一门技术。我想去大厂(字节、阿里、腾讯)😂😂😂,虽然不可能🥲,还没好好专研技术吧。让自己不再摆烂,对知识掌握的程度更高,在找暑期实习的时候多了一些竞争力。,获得了很高的阅读量,可惜文章由于不符合规范背删除了💔。下面代码是来自我的一篇博客,

2023-07-18 11:32:17 537 2

原创 springboot拦截器无法进行属性注入

在使用spring开发的时候需要注意spring容器的作用范围,平时有空的时候多去看看spring的源码。

2023-07-18 10:50:00 600

原创 java: 非法字符: ‘\ufeff‘,java: 需要class, interface或enum 解决方法

问题描述是有非法字符,这就很奇怪了,这个代码以前都是可以运行的,现在打开就不能运行了,第一个想到的就是编码问题,打开设置将编码统一设置为UTF-8

2023-05-13 19:45:41 1509 2

原创 HttpClient5如何设置代理

在这篇文章中会对HttpClient5如何进行代理进行说明,我的HttpClient版本是5.2.1。**在进行代理之前请先准备好代理服务器**。

2023-05-12 23:43:07 2183

原创 springboot中使用mybatis字段不能进行自动映射的解决方法

今天在springboot中使用mybatis的时候不能字段不能够进行自动映射,mybatis的版本是3.5.11,数据库是按照下划线进行命名的,java类遵循驼峰命名法,具体如下。mybatis在默认情况下进行自动映射时只会忽略大小写,并不会处理下划线,需要将 mapUnderscoreToCamelCase 设置为 true。最终查询的结果并没有进行字段映射,只获取到了id,输出如下。最终的解决方法就是在yaml配置文件中进行配置,如下。编写mapper.xml文件如下,用于查询所有数据。

2023-05-07 23:24:25 1697 2

原创 Error creating bean with name ‘org.springframework.aop.aspectj.AspectJPointcutAdvisor#0‘: Cannot cre

使用spring的切面编程时遇到一个错误,错误原因如下。看这个说明,不能创建xxx,应该就是少导入jar包了。解决方法很简单,导入对应的jar包就行,如下。导入之后成功解决问题。

2023-04-17 14:11:28 1174 2

原创 IDEA报错java: Compilation failed: internal java compiler error

在IDEA里面运行java代码,出现java: Compilation failed: internal java compiler error错误。最开始以为是模块中java版本设置的问题,进入project Setting,将各个模块的java版本都设置为Project default,也就是统一设置为java8

2023-04-12 15:37:13 1659 1

原创 【springboot】自动加载分析

springboot在启动的时候会去读取org\springframework\boot\spring-boot-autoconfigure\2.7.10\spring-boot-autoconfigure-2.7.10.jar!\META-INF\spring\org.springframework.boot.autoconfigure.AutoConfiguration.imports这个文件中的所有配置。

2023-04-09 20:42:10 1498 1

原创 【spring】注入bean的8种方式

我们可以让一个类实现FactoryBean,这个接口有一个getObject方法,如果一个使用@Bean标记的方法返回FactoryBean,那么最终返回的是FactoryBean的getObject方法返回的值。二者用法基本一样,只不过@Configuration可以控制注入的Bean是不是一个代理对象,如果是代理对象,那么调用@Bean方法返回的都是同一个对象,否则就不是同一个对象。这时返回Cat已经是一个代理对象了,bigCat返回的都是同一个对象,就是单例模式的。

2023-04-06 16:18:41 3996

原创 纯java编写的联机五子棋项目(附带开源链接)

这是用java写的一个联机五子棋项目,该项目是我大二上期的时候写的,那时候学完了java基础,想要把学的技术都综合使用一下,于是就在国庆节花了3天还是几天写了这个项目。这个项目分为服务端和客户端,它们是基于Socket进行通信的,简单编写了一下java的gui界面。

2023-04-05 19:34:44 2095 6

原创 【java基础】Socket网络编程

这个类表示一个Internet协议(IP)地址,我们可以通过ip或者域名来构建这个类// 通过ip构建InetAddress InetAddress inetAddress1 = InetAddress . getByAddress(new byte [ ] {// 通过域名构建InetAddress InetAddress inetAddress2 = InetAddress . getByName("www.baidu.com");

2023-04-05 18:11:37 1246

原创 【Redis】五大数据结构及其常用指令

Redis里面的数据类型有String、List、Set、Hash、Zset。这篇文章会介绍这5种数据类型并介绍操作它们的指令.

2023-04-05 14:38:56 1203

原创 【java基础】使用Path和Files类,更方便的操作路径和文件

Path是一个接口,里面定义了许多操作路径的便捷方法。获取Path是通过Paths类里面的get方法这个方法会将我们传入的字符串通过路径分隔符连接起来,上面的path连接后的内容如下a\b\c.txtPath里面的方法大家根据需要进行使用即可,都很简单。基本包含了所有对路径的操作Files里面方便的方法还有很多,这里只说明了几个常用的方法,感兴趣可以直接再去看一下官网文档。

2023-04-03 17:13:23 3076 2

原创 【java基础】对象序列化和反序列化详解

在上面,我们知道看transient关键字标识之后不会被序列化,于是b字段就为null,这里我们使用自定义序列化机制来解决这个问题。序列化机制为单个的类提供了一种方式,去向默认的读写行为添加验证或任何其他想要的行为。之后,数据域就再也不会被自动序列化,取而代之的是调用这些方法。我们只需要在A类中添加这2个方法,然后编写对应的方法即可out . writeUTF("我是B--通过自定义方式实现序列化");} }

2023-04-03 14:35:25 1831

原创 java中的UTF-16编码详解,什么是码点?什么是字符?

对于UTF-16,他是变长的,在0~65535使用2个字节进行存储,其余使用4个字节进行存储。[0xD800,0xDFFF]中的码点未定义任何字符,专用于UTF-16的代理项对应大于等于65536的Unicode,会进行代理,最终变为2个小于65536的值0xD800和0xDC00相差了0x0400,也就是 0100 0000 0000, 刚好比 0011 1111 1111多1,也就是说高位代理项和低位代理项不会重复。系统仅凭一个字符就能够判断是高位代理项还是低位代理项。

2023-04-02 23:03:51 1789

原创 【java基础】输入/输出流基本介绍

InputStream和OutputStream算是所有二进制输入/输出的父类,而Reader和Write算是所有字符输入/输出的父类。它们的子类提供了各种形式的输入/输出方法,我们使用它们可以很轻松的完成输入/输出操作。

2023-04-02 16:25:22 1439 1

原创 maven依赖管理(依赖配置、依赖传递、依赖冲突、依赖范围)

在这篇文章中介绍了maven中的一些基础概念,maven的依赖传递规则,出现冲突的一些处理等,具体可以参考官方文档。

2023-04-02 13:36:49 2036

原创 使用chatgpt实现微信聊天小程序(秒回复),github开源(附带链接)

我在前一段时间突发奇想,就使用java来调用chatgpt的接口,然后写了一个简单小程序,也上了热榜第一,java调用chatgpt接口,实现专属于自己的人工智能助手,事实上,这个程序毛病挺多的,最不能让人接受的一点就是返回速度非常缓慢(即使使用非常好多外网服务器)。现在,我改进了一下程序,使用异步请求的方式,基本可以实现秒回复。并且还基于webSocket编写了一个微信小程序来进行交互,可以直接使用微信小程序来进行体验。

2023-03-31 19:44:17 81585 167

原创 【java基础】一篇文章彻底搞懂Optional

在java中,我们要学习一个类,第一步要做的应该就是去了解该类的继承关系以及有些上面方法,在有需要时还应当查看一些源代码中的注释。下面我们就来看看Optional的类图以及该类中的方法和字段我们再来看看该类上面的注释翻译过来就是一个容器对象,它可能包含也可能不包含非null值。如果存在一个值,isPresent()将返回true,get()则返回该值。提供了取决于所包含值是否存在的其他方法,如orElse()(如果值不存在,则返回默认值)和ifPresent()(当值存在时执行代码块)。

2023-03-27 16:54:26 1488

原创 java调用chatgpt接口,实现专属于自己的人工智能助手

今天突然突发奇想,就想要用java来调用chatget的接口,实现自己的聊天机器人,但是网上找文章,属实是少的可怜(可能是不让发吧)。找到了一些文章,但是基本都是通过调用别人的库来完成的,导入其他的jar还有不低的学习成本,于是就自己使用HttpClient5写了一个,在这里讲解一下思路。对于ApiKey,只能说难者不会,会者不难,这个没办法教。如果代码无法运行,或者运行速度及其缓慢,请使用代理,在HttpClient里面可以很轻松的使用代理上面就是一个示例,对于代理,这里也就无法继续进行说明了。

2023-03-23 22:25:32 53460 92

原创 【java基础】Stream流的各种操作

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。与集合相比,流提供了一种可以让我们在更高概念级别上指定计算任务的数据视图注意:学习Stream必须要十分清晰的了解lamdba表达式,如果lambda不清楚,请参考一篇文章彻底搞懂lambda表达式。

2023-03-21 17:15:35 3171

原创 【java基础】BitSet基本说明和使用

Java平台的BitSet类用于存储一个位序列(它不是数学上的集,如果称为位向量或位数组可能更为合适)。如果需要高效地存储位序列(例如,标志),就可以使用位集。由于位集将位包装在字节里,所以使用位集要比使用Boolean对象的ArrayList高效得多。说人话就是使用位来存储boolean信息,0表示假,1表示真。BitSet由于使用bit位来存储信息,所以占用空间会比boolean数组使用空间更小,并且带有去重功能。该数据结构的一个应用就是10亿个手机号码去重(面试造火箭)

2023-03-16 14:22:56 3242 2

原创 【java基础】HashMap源码解析

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。HashMap 是无序的,即不会记录插入的顺序。HashMap 继承于AbstractMap,实现HashMap使用K-V的形式存储数据,Map的扩容机制是按照2倍进行的,当达到阈值时就会扩容。当hash冲突严重时,链表会转换为红黑树,当树元素个数很少时,又会退化为链表。

2023-03-11 16:26:32 1400

原创 【java基础】LinkedList源码解析

在java中,LinkedList就是使用双向链表存储元素,既然是链表,那么也就知道了该数据结构擅长添加和删除。对于需要频繁添加和删除的,我们应该使用LinkedList而表示ArrayList在开始介绍LinkedList之前,我们先来看一下该类的属性/**= null)/**= null)这三个属性就分别表示集合元素个数,头节点,尾节点。然后需要查看的就是类图,这是必不可少的!!!对于上面的类图,大家自行查看即可。

2023-03-11 10:11:09 776

原创 【java基础】ArrayList源码解析

ArrayList是使用数组存储元素的的集合,能够自动进行扩容。ArrayList的类图如下该类拥有许多操作集合的方法,在这篇文章中将会debug几个常见的方法。这里先将ArrayList的成员属性以及注释列出来/**/**/**/*** @serial对于ArrayList,就理解为一个简单的数组即可,该数组会自动扩容(一般为1.5)。

2023-03-11 09:05:33 2506

空空如也

空空如也

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

TA关注的人

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