自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 java不可变集合

不可变集合的特点?定义完成后不可以修改,或者添加、删除如何创建不可变集合?List、Set、Map接口中,都存在of方法可以创建不可变集合三种方式的细节List:直接用Set:元素不能重复Map:元素不能重复、键值对数量最多是10个,超过10个用ofEntries方法。

2024-04-30 12:28:22 315 1

原创 线上论坛自动化测试

对论坛项目进行测试用例编写,通过 Selenium + JUnit 单元测试框架对项目的功能进行自动化测试。论坛项目的部分功能:用户注册登录、帖子详情查看、帖子发布、修改、删除、用户个人信息展示和修改。

2024-04-25 17:14:36 299

原创 java-springboot实现图片的上传

结果报错了,明显我们要保存的路径是不对的,为什么,因为 multipartFile 要的是绝对路径,不是相对路径,如果是相对路径的话,他不会在你相对路径前面添加你项目的路径,而是tomcat的路径,因此我们修改一下。如果你的程序要部署到云服务器上,那绝对路径和照片的url是要更改的。我们在resources目录下创建image目录来存放上传的图片。一般照片的访问路径是要保存到数据库,然后前端根据路径找到照片的。service层懒的写,就都写controller层了。结果对了:我们的目录出现了上传的图片。

2024-03-26 22:10:03 986 3

原创 Centos7环境下安装Docker详细步骤

环境:Centos7推荐:买个Centos7阿里或者腾讯云服务,这样就可以不用安装虚拟机了。

2024-02-20 13:18:25 517

原创 Mybatis- plus 基本使用

为了简化单表CRUD,MybatisPlus提供了一个基础的。

2024-02-07 19:34:14 1157

原创 Spring MVC 中的常用注解和用法

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为“Spring MVC”。从上述定义我们可以得出两个关键信息:1.Spring MVC 是⼀个 Web 框架。2.Spring MVC 是基于 Servlet API 构建的。MVC 是。

2023-12-17 10:23:18 236

原创 java死锁的成因和解决方案

在Java中,死锁是指两个或多个线程互相持有对方所需要的锁,并且在无法继续执行的情况下永久地等待对方释放锁。这种情况下,所有涉及的线程都无法继续执行,程序被卡住,无法正常终止。死锁通常发生在多线程并发执行时,当线程之间相互竞争获取资源的时候。互斥:至少有一个资源同时只能被一个线程占用;占有并等待:一个线程已经占有一个资源,同时还等待另一个线程占有的资源;不可剥夺:一个线程已经占有的资源不能被其他线程强制性剥夺;环路等待:多个线程之间形成等待资源的环路。

2023-12-08 15:30:14 368

原创 java线程的几种状态

5. 计时等待状态(Timed Waiting):线程进入计时等待状态是因为它在等待另一个线程执行特定的操作,但等待时间有限。线程进入计时等待状态时,会在指定的时间内等待,超过指定时间后会自动唤醒。4. 等待状态(Waiting):线程进入等待状态是因为它在等待另一个线程执行特定的操作。线程进入等待状态时可以指定一个超时时间,在超时时间到达前,线程会一直等待,直到被唤醒。6. 终止状态(Terminated):线程执行完任务或者发生异常导致线程终止时,线程处于终止状态。

2023-12-08 14:28:52 215

原创 java - 定时器

定时器是指可以通过 Java 中的 Timer 类和 TimerTask 类所提供的功能来实现定期执行某些任务的工具。标准库中提供了一个 Timer类. Timer类的核心方法为schedule .schedule 包含两个参数第一个参数指定即将要执行的任务代码第二个参数指定多长时间之后执行 (单位为毫秒).System.out.println("5 秒钟已经过去了...");}, 5000);

2023-11-26 22:39:37 320

原创 JAVA - 阻塞队列

堵塞队列(Blocking Queue)是一种特殊类型的队列,它具有一些特定的行为和限制。在堵塞队列中,当队列为空时,尝试从队列中取出元素的操作将会被阻塞,直到队列中有可用元素;当队列已满时,尝试向队列中添加元素的操作也会被阻塞,直到队列有空闲位置。堵塞队列常用于多线程编程场景中,用于实现线程间的安全通信和协调。它提供了一种简单而有效的方式来实现线程的等待和唤醒机制,使得线程能够在合适的时机进行阻塞或继续执行。ArrayBlockingQueue:基于数组的有界堵塞队列。

2023-11-26 14:36:06 104

原创 java - 二分查找

二分查找(Binary Search),也称为折半搜索或对数搜索,是一种在有序数组或列表中查找特定元素的算法。它的工作原理是将待查找的区间一分为二,并确定目标值位于哪个子区间中,然后通过不断缩小区间的范围来迭代查找,直到找到目标值或确定不存在目标值为止。二分查找的前提是要在有序数组或列表中进行查找,因为它需要根据中间元素的大小关系来决定接下来要查找的区间。初始化左右边界:将整个数组或列表的左边界设置为0,右边界设置为n-1,其中n是数组或列表的长度。

2023-11-25 17:26:32 144

原创 java - 归并排序

归并排序是一种常见的排序算法,也是一种分治策略的典型应用。该算法的基本思想是将待排序的序列分成若干个子序列,然后递归地对这些子序列进行排序,最终将排好序的子序列合并成一个有序序列。具体来说,归并排序的过程可以分为两个阶段。第一个阶段是分解,即将原序列分成若干个长度相等的子序列,每个子序列再分成若干个长度相等的子序列,直到无法分解为止。第二个阶段是合并,即将已排好序的子序列合并成一个有序序列。

2023-11-25 09:55:23 172

原创 java - 快速排序

快速排序(QuickSort)是一种常用的排序算法,属于交换排序的一种。它的基本思想是通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的关键字都比另一部分记录的关键字小,然后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。从待排序序列中选择一个元素作为基准元素。通常选择序列的第一个元素,但也可以随机选择或者选择中间元素。将比基准元素小的元素移到基准元素的左边,将比基准元素大的元素移到基准元素的右边。基准元素在这一过程中已经找到了最终的位置,它左边的元素都比它小,右边的元素都比它大。

2023-11-24 16:26:10 228

原创 java - 插入排序

插入排序(Insertion sort)是一种简单直观的排序算法。它的基本思想是将待排序序列分为已排序和未排序两部分,初始时已排序部分只有一个元素,然后从未排序部分逐个取出元素并插入到已排序部分的正确位置,直到所有元素都插入完毕。从待排序序列中取出第一个元素,认为它已经是排好序的。取出下一个元素,在已排序的序列中从后向前扫描,将较大的元素向后移动,给当前元素找到合适的位置。重复步骤2,直到找到当前元素的正确位置。重复步骤2和步骤3,直到所有元素都插入完毕。

2023-11-24 11:00:09 549

原创 java - 冒泡排序

冒泡排序(Bubble sort)是一种简单的排序算法,其基本思想是通过相邻元素的比较和交换,将较大的元素逐渐交换到序列的一端,从而达到排序的目的。从序列的第一个元素开始,依次比较相邻的两个元素。如果它们的顺序不正确(比如当前元素大于下一个元素),则进行交换,将较大的元素向序列的末尾移动。继续向后遍历序列,重复进行相邻元素的比较和交换操作,直到完成一轮遍历。重复上述步骤,直到序列排序完成,即没有发生任何元素交换的情况。

2023-11-24 10:35:05 90

原创 java - 选择排序

选择排序(Selection sort)是一种简单直观的排序算法。它的基本思想是每次从待排序的元素中选择最小(或最大)的元素,将其放到已排序序列的末尾,直到所有元素排序完成。首先,在待排序序列中找到最小(或最大)的元素,将其与序列的第一个元素进行交换。接着,在剩下的未排序序列中继续执行上述操作,即找到最小(或最大)的元素,将其与序列的第二个元素进行交换。重复上述步骤,直到所有元素排序完成。选择排序的时间复杂度为O(n^2),其中n为待排序序列的长度。

2023-11-24 10:06:13 75

原创 C/S与B/S架构的优缺点

简要介绍一下C/S与B/S架构的优缺点.

2023-09-24 10:03:10 143

原创 MyLinkedList--自己实现单链表

使用双指针,pre是cur的前指针,cur用来判断是否等于key,等于那就让pre.next=cur.next,删掉cur指向的节点,然后继续往下走直到末尾.如果删除的是头节点,那就让头节点=头节点的next,如果不是,那就需要找到删除节点的前一个节点,链表的头节点的位置插入一个新节点,新节点的next指向head,并让head指向next.尾节点的位置插入一个新节点,先遍历链表找到尾部的节点,让尾部的节点的next指向新节点.让它的next等于删除节点的next,这样就删除next了.

2023-09-18 14:47:50 75

原创 总结 LinkedList

发现跟ArrayList的方法是一样的,也就是说 List<> list=new ArrayList<>();与List<> list=new LinkedList<>();对于list的方法是一样的.就是底层实现跟使用场景不一样.3. LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问 比特就业课。4. LinkedList的任意位置插入和删除元素时效率比较高,时间复杂度为O(1)5. LinkedList比较适合任意位置插入的场景。

2023-09-18 09:59:46 57

原创 总结Java ArrayList

5. 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者 CopyOnWriteArrayList。ArrayList是一个动态类型的顺序表,即:在插入元素的过程中会自动扩容。3. ArrayList实现了Cloneable接口,表明ArrayList是可以clone的。6. ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表。2.2 如果用户所需大小超过预估1.5倍大小,则按照用户所需大小扩容。

2023-09-18 09:41:11 46

原创 spring boot 操作 Redis步骤

3.通过Spring Boot操作Redis。1.添加Redis驱动依赖。

2023-09-11 16:48:30 37

原创 总结Redis

答:跳跃表 Skip list,也称之为跳表,是一种数据结构,用于在有序元素的集合中进行高效的查找操作它通过添加多层链表的方式,提供了一种以空间换时间的方式来加速查找。跳跃表由一个带有多层节点的链表组成,每一层都是原始链表的一个子集。最底层是一个完整的有序链表,包含所有元素。每个更高层级都是下层级的子集,通过添加额外的指针来跳过一些元素。这些额外的指针称为“跳跃指针”,它们允许快速访问更远的节点,从而减少了查找所需的比较次数。跳跃表的平均查找时间复杂度为 0og n),其中 n 是元素的数量。

2023-09-11 16:04:47 60

原创 加盐算法(Spring Boot)

2.MD5加密的密码是有规律可循的,因为所有固定的字符都会有固定的 MD5,因此如果有一个库(彩虹库{字符 | 字符的MD5 })带有所有的字符和字符的MD5,就可以破解所有的MD5加密了.salt 的长度是 32位. UUID是由32位字符加4个分隔符 ("-") 组成的.由于repalce去掉了分隔符,因此就剩32位了.最终返回的密码是 32+1('$'分隔符)+32=65位.也就是说最终返回的密码一定是65位的.MD5加密的得到的密码是32位的,因此finalPassword是32位的.

2023-09-10 11:18:14 587

原创 String 类的常用方法

【代码】String 类的常用方法。

2023-09-07 10:42:24 97

原创 SpringBoot时间格式化的2种方法!

Controller 在返回数据时,会自动调用 Spring Boot 框架中内置的 JSON 框架 Jackson,对返回的数据进行统一的 JSON 格式化处理,在处理的过程中它会判断配置文件中是否设置了“spring.jackson.date-format=yyyy-MM-dd HH:mm:ss”,如果设置了,那么 Jackson 框架在对时间类型的字段输出时就会执行时间格式化的处理,这样我们就通过配置来实现全局时间字段的格式化功能了。从上述结果可以看出,使用注解的方式也可以实现时间的格式化。

2023-09-06 14:55:23 469

原创 总结Spring事务传播机制

Spring 事务使用中,重点的内容有 3 个:1.在 Spring 项目中使用事务,⽤两种方法手动操作和声明式自动提交,其中后者使用的最多,在方法上添加 @Transactional 就可以实现了。2.设置事务的隔离级别 @Transactional(isolation = Isolation.SERIALIZABLE),Spring 中的事务隔离级别有 5 种。3.

2023-09-03 16:54:07 39

原创 总结Spring 事务

但也会有新的问题,比如此级别的事务正在执行时,另⼀个事务成功的插入了某条数据,但因为它每次查询的结果都是⼀样的,所以会导致查询不到这条数据,自己重复插入时又失败 (因为唯⼀约束的原因)。但由于在事务的执行中可以读取到其他事务提交的结果,所以在不同时间 的相同 SQL 查询中,可能会得到不同的结果,这种现象叫做不可重复读。⼀致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。脏读:⼀个事务读取到了另⼀个事务修改的数据之后,后⼀个事务又进行了回滚操作,从而导致第⼀个事务读取的数据是错误的。

2023-09-03 11:54:10 38

原创 总结Spring AOP

AOP(Aspect Oriented Programming):面向切面编程,它是⼀种思想,它是对某⼀类事情的 集中处理。比如用户登录权限的效验,没学 AOP 之前,我们所有需要判断用户登录的页面(中 的方法),都要各⾃实现或调用用户验证的方法,然而有了 AOP 之后,我们只需要在某⼀处配置⼀下,所有需要判断用户登录页面(中的方法)就全部可以实现⽤户登录验证了,不再需要每 个方法中都写相同的用户登录验证了。

2023-08-31 11:25:03 36

原创 总结MyBatis 动态SQl

注意: 以上标签也可以使用 替换。注意: 以上标签也可以使用 替换。给语句加上"("的前缀和")"的后缀,并且删除语句最前面的",".其中如果语句没有","那就不动。给语句加上"("的前缀和")"的后缀,并且删除语句最后的",".其中如果语句没有","那就不动。去除内容最前面的"and"关键字.

2023-08-29 21:26:17 46

原创 总结MyBatis

特殊的添加:返回自增 id keyColumn:设置生成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列 不是表中的第⼀列的时候,是必须设置的。注意:${} 使用场景:当业务需要传递SQL命令时,只能用${},不能用#{},注意事项 使用${},那么传递的参数一定要能被穷举,否则时不能使用. 尽量使用 #{}, 无法实现业务的时候才使用${}.注意: 虽然${}不安全,但是在某些场景下只能使用${},而#{}无法完成任务是: 传递的参数就是sql语句。框架会自动识别类里的成员变量的。

2023-08-29 20:04:30 46

原创 总结 Bean 的生命周期的各个阶段

2.初始化的前置方法。4.初始化的后置方法。2.根据配置完成Bean初始化。5.卖出去 (Bean 销毁)3.注册Bean对象到容器中。3.买家电 (各种初始化)4.入住 (使用Bean)4.装配Bean的属性。1.先买房 (实例化)2.装修(设置属性)

2023-08-18 10:51:56 37

原创 总结 Bean 的六种作用域

场景:WebSocket 的每次对话中,保存了一个Map结构的头信息,将用来包裹客户端消息头.第一次初始化后,直到WebSocket结束都是同一个Bean。描述:每次对该作用域下的Bean的请求都会创建新的实例: 获取 Bean 以及装配 Bean 都是新的实例.描述:该作用域下的Bean再ioc容器中只存在一个实例:获取Bean以及装配Bean。场景:通常无状态的Bean使用该作用域.无状态表示Bean对象的属性状态不需要更新。场景:用户回话的共享Bean,比如:记录一个用户的登陆信息。

2023-08-18 10:18:42 225

原创 总结 Spring 中存取 Bean 的相关注解

注意:想要将对象成功的存储到 Spring 中,我们需要配置⼀下存储对象的扫描包路径,只有被配置的 包下的所有类,添加了注解才能被正确的识别并保存到 Spring 中。注意:@Controller / @Service / @Repository / @Configuration都是属于 @Component 的“⼦类”。1.类注解:@Controller , @Service , @Repository, @Component , @Configuration。Service 类的实现代码如下。

2023-08-17 21:14:37 95 1

原创 抽象类与接口的区别

总之,抽象类和接口都是用来定义抽象的数据类型,但是它们的使用场景和语法有所不同。抽象类适合用于定义一些具有共性的类,而接口适合用于定义一些具有相似功能的类。抽象类的方法可以有public、protected和default访问修饰符,而接口的方法只能有public访问修饰符。抽象类的子类必须实现所有抽象方法,而实现接口的类必须实现所有接口中的方法。抽象类可以包含非抽象方法,而接口只能包含抽象方法。抽象类可以有构造方法,而接口不能有构造方法。抽象类可以有普通方法,而接口不能有普通方法。

2023-08-16 11:11:21 53 1

原创 总结JVM垃圾回收

JVM(Java虚拟机)的垃圾回收是指自动管理内存分配和释放的过程。在Java程序中,当对象不再被引用或者不可达时,垃圾回收器会自动识别并回收这些对象所占用的内存空间,使其能够被再次使用。垃圾回收的主要目标是通过释放不再使用的对象所占用的内存,以最大化可用内存空间,减少内存泄漏和程序崩溃的可能性。垃圾回收器会周期性地运行,自动检测和回收不再使用的对象。在垃圾回收的过程中,垃圾回收器会首先标记出所有的存活对象,然后清理掉那些没有被标记的对象。

2023-08-10 19:33:38 51 1

原创 总结JVM类加载的过程

把.class 文件,加载到内存,得到类对象这样的过程在JVM中,类加载会经历以下5个阶段:1.加载阶段(Loading):找到.class文件,并且读文件内容2.验证阶段(Verification):.class文件有明确的数据格式(二进制)3.准备阶段(Preparation):给 类对象 分配内存空间4.解析阶段(Resolution):针对字符串常量 进行初始化5.初始化阶段(Initialization):针对类对象进行初始化(初始静态成员,执行静态代码块.......)

2023-08-10 16:20:57 49 1

原创 总结JVM中内存区域分划

其中: 堆和元数据区,在一个jvm进程中,只有一份,而栈和程序计时器则是存在多份的,每一个线程都有一份. 因为:栈维护方法之间的调用关系,程序计数器的用途是记录当前程序执行到哪个指令了,线程都是独立的,因此每个线程都有自己的一份.t本身是一个引用类型,也是一个局部变量,因此 t是在栈上的,而new Test()这个对象,对象的本体是在堆上的. func()在方法区. 一个方法在内存中是一些二进制指令的方式来存储的(字节码).方法区也是所有线程共享的。总结:本地方法栈是给jvm内部的本地方法使用的.

2023-08-10 13:43:23 54 1

原创 Mysql数据库错误:ERROR 1366 (HY000): Incorrect string value: ‘xxxxx‘ for column

我们在创建数据库的时候不要偷懒,加上 'character set utf8mb4 collate utf8mb4_general_ci;原因是MySQL8.0之前版本默认的字符集是latin1,修改为utf8即可.

2023-08-09 19:54:54 1295 1

原创 总结Linux 的常用命令(二)

总结来说,“-r"和”-R"选项都用于递归操作,但具体的含义会根据不同的命令有所不同。-R选项:它也是"递归"选项的意思,但在某些命令中,它被用来表达更具体的含义。例如,在"chmod"命令中,使用"-R"选项可以递归地更改目录及其子目录和文件的权限。因为:文件系统中,每个文件的 "路径" 就是一个简单的属性,mv就只是修改了这个"路径"我在学习的时候,有这样的疑问:-r 与 -R是不是一样的东西啊?-R 或 --recursive递归处理,将指定目录下的文件及子目录一并处理。

2023-08-09 13:31:01 84 1

原创 总结Linux 的常用命令(一)

注意:echo和cat这样的命令只是针对简单的文件进行操作,如果文件复杂,或者编辑的需求复杂,就不太适合了.上面两个命令适合我们需要脚本批量处理很多操作的时候.显示用户当前所在的目录的路径,防止用户迷路,有的时候,cd了太多次,都不记得哪是哪了,这时候就可以使用pwd查看当前的完整路径.其中,蓝色的是目录,白色的是普通文件,如果服务器没有东西,那执行代码,会啥都没有.注意:cat读取小的文件,是可以的,如果文件很大,很长,那cat就不方便了。上面表示text文件是一个空的文件,我们找一个不空的文件看看.

2023-08-08 15:00:08 42 1

空空如也

空空如也

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

TA关注的人

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