自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SpringMVC源码探究——SpringMVC的启动及容器初始化(注解方式)

servlet规范规定,在servlet启动时,要通过ServletContainerInitializer处理所有@HandlesTypes中标注的类,而ServletContainerInitializer是一个接口。而ServletContainerInitializer的实现类是Tomcat通过SPI机制加载的。1.SPI机制根据以上的知识,我们可以找到SpirngMVC实现了ServletContainerInitializer的类:SpringServletContainerIniti

2022-06-13 16:31:15 385 1

原创 记录一下使用JPA时遇到的坑

这几天做实习任务,发下来的项目ORM框架使用的是JPA,之前完全没有接触过,不过也能照葫芦画瓢写一下,这过程中碰到了一点坑,特此记录一下,后期如果再碰到还会继续更新。项目比较老 Spring-boot版本是1.5.6对应的spring-boot-jpa版本也是1.5.6.RELEASE该方法传了两个参数 都是String 然后运行时报错JPA-style positional param was not an integral ordinal;说是没有按照顺序使用JPA风格的参数SQL部分语句是这样的

2022-06-04 12:39:53 485

原创 MySQL锁查漏补缺

前言今天看到了这篇文章 ——了解常见锁类型看到了许多自己不了解或没见过的锁,特此记录一下。意向锁使用场景/诞生背景在innodb引擎下,我们已经在一个表的某行上加上了行锁,此时又需要对该表加表锁。这时引擎会挨个遍历表中的每一行,判断是否有行锁,若有则加锁失败。这样效率显然比较低下,于事意向锁就诞生了。意向锁特点意向锁分为读意向锁(IS锁)与写意向锁(IX锁) 且均为表级锁当某个事务要加行锁时,会先在整个表上加意向锁,这样就解决了加表锁时要遍历全表的问题,大大提高了性能。意向锁直接按,意向

2022-05-27 22:33:39 173

原创 Spring源码探究——Spring的AOP是如何实现的

前言&准备工作在之前的源码分析文章中,我们介绍了IoC的执行流程,在本篇文章中,我们来解析一些Spring的另一大功能——AOP。准备工作1.准备被切入的方法方法@Componentpublic class HelloService {public void sayHello(){ System.out.println("HELLO WORLD");}}2.准备切面@Aspect@Componentpublic class LogAspect { @Bef

2022-05-02 22:42:22 444

原创 Spring源码探究——以配置类启动方式来看IoC容器初始化流程

准备工作在之前的源码系列文章中,我介绍了Spring是如何从无到有帮我们创建并返回Bean的,之前文章是基于xml配置文件的方式进行解读了,这次我们来分析一下:Spring是如何通过配置类文件来初始化整个容器的。这个流程对我们分析AOP相关源码很有帮助。准备配置类@EnableAspectJAutoProxy@Configuration@ComponentScan(value = "com.core.aop")public class AopConfig {}准备测试方法

2022-04-24 21:40:39 717

原创 Spring源码探究——Spring如何帮我们创建Bean(下)

前言在上篇中,我们已经了解了Spring是如何读取我们配置的xml文件并把它转化为BeanDefinition对象并保存到容器中的。在BeanDefinition中保存了Bean的所有信息,有了它实例化Bean就变得轻而易举了。在本篇,我们会了解到Spring是如何根据BeanDefinition(以下简称bd)把bean实例化并返回给我们使用的。

2022-04-12 16:21:50 450

原创 Spring源码探究——Spring如何帮我们创建bean(上)

准备工作首先准备测试用的类,我们使用最简单的xml配置的方式来进行源码的探究1.准备Person类public class person { String name; int age; person() { } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age;

2022-04-09 22:40:56 799

原创 Synchronized锁膨胀机制

前言最近在读《深入理解JVM》,读到第13章 线程安全与锁优化中的轻量级锁与偏向锁时,总是难以理解,直到读到了这篇 死磕Synchronized底层实现–概论后,才恍然大悟,逐渐理解了书中的内容,特此来记录一下。锁膨胀流程被Synchronized修饰的方法/代码块,根据争抢线程的数量,时机不同,会经历以下的过程#mermaid-svg-lTu2y1X3695EllPk {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16

2022-03-30 22:10:37 642

原创 从JVM角度看重载与重写——静态分派与动态分派

重载1.静态类型与实际类型代码示例class Human{}class Man extends Human{}class Woman extends Human{}根据java的多态的特性,我们可以这样定义一个Human对象Human human = new Man();其中 Human即为human对象的静态类型Man为human对象的动态类型。静态类型在程序编译期即可确定,而动态类型要在编译结束后才能确定。了解这些后接着来看重载2.静态分派首先准

2022-03-12 22:28:16 588

原创 前缀树实现敏感词过滤

前缀树的节点类为了方便功能的实现,我们需要有一个Boolean类型的变量来标记该节点是否为叶子节点,同样的为了方便判断是否存在某个字符在前缀树中,可以把子节点作成Map的形式,Map的key为该字符,value为真正的子节点。 private class TrieNode { //该节点是否为叶子节点 boolean isEnd; //该节点的子节点 Map<Character, TrieNode> subNode;

2022-03-03 20:11:50 553

原创 HashMap 扩容方法,put方法源码解读

//我们调用的put方法 public V put(K key, V value) { //真正的put方法 return putVal(hash(key), key, value, false, true); }/*Implements Map.put and related methods.Params:hash – hash for keykey – the keyvalue – the value to putonlyIfAbsent – if true.

2022-02-17 18:07:19 282

原创 删除二叉排序树的节点 java实现

//在节点类中需要准备的方法/** * 查找指定值对应的节点 * * @param val 指定值 * @return 对应的节点 */ public BinarySortTreeNode searchNode(int val) { //如果当前值为指定值,直接返回 if (this.val == val) { return this; //当前值小于指定值 .

2022-02-12 22:00:22 394

原创 哈夫曼编码 java实现

用哈夫曼树压缩一个字符串,解压以后再写

2022-02-07 19:29:51 667

原创 在数组中查找元素第一个与最后一个的位置

1.当数组无序时:双指针+递归class Solution { public int[] searchRange(int[] nums, int target) { //空数组,直接返回 if(nums.length == 0) { return new int[]{-1,-1}; } //初始左指针,指向第一个元素 int left = 0; //

2022-02-05 21:58:24 962

原创 堆排序 java实现

堆排序就是一种特殊的选择排序,借助顺序二叉树大顶堆/小顶堆的特性,每次将根节点与末尾节点交换值,再将出末尾节点之外的节点重新构造大顶堆/小顶堆,直到未排序的数为1(该值为最大/最小值)时结束排序。public class HeapSort { public static void main(String[] args) { int[] arr = {4,6,8,5,9,-12,1,-895,1000}; headSort(arr); Syste

2022-02-05 21:49:28 650

原创 ArrayList 与Vector的扩容机制比较

最近开始背面试八股文,本着死记硬背不如真正理解的想法。我会记录一下自己对一些题目的理解(前提是自己能理解得了????)开始正题首先是增方法均已add(E e)先来看ArrayList的与增加有关的方法的源码 /** @param elementData 我们实际操作的数组 @param size 数组的大小 @param modCount 当前对象修改次数,与线程通信相关 */ public boolean add(E e

2022-01-30 22:30:29 610

原创 插值查找 斐波那契查找 java实现

二者与二分查找思想类似,只不过划分中值点的位置不同插值查找的中值点为:left+(right-left)*(value-arr[left])/(arr[right]-arr[left]);斐波那契的中值点为:int mid = left + fibo[k - 1] - 1;具体实现代码如下插值public static int insertResearch(int[] arr,int left,int right,int value) { if (l

2022-01-25 22:34:29 339

原创 基数排序 二分查找java实现

1.基数排序基本思想:依次将要排序数字的个位,十位,百位...依次对应放入编号为0~9的桶中,每次放入后重新从桶中拿出数据,在进行下一次。直到最高位从桶中拿出后,得到的即为有序数组 public void sort(int[] arr) { // 找出最大值的位数,决定了要循环几次 int max = 0; for (int i = 0; i < arr.length; i++) { if (arr[i] > ma

2022-01-24 21:53:37 270

原创 希尔排序 快速排序 归并排序 Java实现

1.希尔排序将数组分成n组,n/2组,n/4组...1组,在每次分组后在组内进行排序。最后得到有序的数组//通过交换的方式实现public void sort(int[] arr) { int temp = 0; for (int gap = arr.length / 2; gap > 0; gap /= 2) { for (int i = gap; i < arr.length; i++) {

2022-01-21 22:37:52 442

原创 冒泡排序 选择排序 插入排序 java实现

1.冒泡排序原理;每一次排序都将最大/小的元素放在数组的最末尾public class BubbleSort implements Sort { @Override public void sort(int[] arr) { for (int i =0;i < arr.length-1;i++) { boolean flag = true; for (int j = 0;j < arr

2022-01-20 22:25:19 458

原创 递归解决迷宫问题 Java

public class MazeRecursion { int[][] maze = new int[9][9]; public void initMaze(){ for (int i = 0;i < 9;i++) { maze[0][i] = 1; maze[i][0] = 1; maze[8][i] = 1; maze[i][8] = 1; .

2022-01-18 22:37:15 235

原创 leecode银行

抽象成一个二维数组进行遍历运算即可 public int totalMoney(int n) { int base = 1; int total = 0; for(int i = 0;i < n/7;i++) { int additon = base; for(int j = 0; j <7;j++ ) { total = total+a...

2022-01-15 21:33:07 3354

原创 计算器功能的简单实现 java 中缀表达式

数组栈public class ArrayStack { int maxsize; int stack[]; int top; ArrayStack(int maxsize) { this.maxsize = maxsize; top = -1; stack = new int[maxsize]; } boolean isEmpty() { return top == -1;

2022-01-13 21:57:30 241

原创 约瑟夫环 循环链表解决 java

public class LoopList { Node head = new Node(0); static int position = 1; LoopList(){ head.next = head; } void addNode(Node node) { Node temp = head; Node cur = node; while (temp.next != head) .

2022-01-11 22:10:21 118

原创 合并两个有序链表 java实现

/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * }.

2022-01-10 22:20:29 405

原创 单向链表 反转链表 java实现

//节点结构public class Node { int data; Node next; Node(int data){ this.data =data; next = null; } @Override public String toString() { return "Node{" + "data=" + data + '}'; .

2022-01-09 20:08:13 328

原创 缓存击穿 缓存穿透 缓存雪崩

缓存穿透用户所请求的key无论是在缓存中还是在数据库中都没有,当有大量的这种请求过来时,可能会导致数据库的崩溃解决方法:1.对空值缓存:对这些不存在key也进行缓存,并且设置生命周期为1-5min。2.设置白名单:使用bitmaps类型定义一个可以访问的名单,名单id作为bitmaps的偏移量,每次访问和bitmap里面的id进行比较,如果访问id不在bitmaps里面,进行拦截,不允许访问。3.使用布隆过滤器:(布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是

2022-01-08 21:53:50 526

原创 稀疏数组与循环队列 java实现

稀疏数组 public static void main(String[] args) { int simpleArr[][] = new int[8][8]; simpleArr[1][2] = 10; simpleArr[2][4] = 8; simpleArr[6][3] = 7; simpleArr[5][7] = 4; simpleArr[1][3] = 1; for (int[]

2022-01-08 21:11:53 265

原创 redis主从复制

1.主从复制将一台服务器作为主机,别的服务器作为它的子机。子机会自动获取主机上的所有写的数据,当主机意外宕机时,就可以在子机上查看主机的数据。主机以写操作为主,备机以读操作为主。优点:读写分离,性能扩展 容灾快速回复2.相关指令1.查看当前机器的角色 info replication2.设置跟随的主机 SLAVEOF 主机ip 端口号3.回到初始角色(master) SLAVEOF no one3.一些问题1.slave1、slave2是从头开始复制还是从切入

2021-12-29 22:30:45 898

原创 使用Spring与原生Servlet时遇到的问题——bean无法注入

背景这学期开设了javaweb与相关的实训课,实训课需要做一个web项目。为了体现web课的成果。我们小组本来打算采用Spring Ioc + Servlet +Mybatis来完成实训项目。今天真正搭建环境时却出了问题。问题在定义好了Dao层与Service层后,准备在web层调用Service层。当浏览器发出请求时,发生空指针异常排查1.首先直接引用dao层,仍发现空指针错误。说明从dao层开始就注入失败2.直接自动注入在Spring配置文件applicatio.

2021-12-28 22:41:44 512 1

原创 Redis持久化 RDB与AOF

redis通过RDB与AOF实现了数据持久化1.RDBrdb即redis database。redis数据库。当在redis中的数据储存满足配置文件中的要求时(如图,分别是一小时修改一个键,5分钟之内修改100个键,1分钟只能有超过10000个键被修改),redis就会在redis的根目录下生成一个dump.rdb文件,这个dump.rdb文件就存储着这个时间段内修改过的键值对的信息。当redis服务关闭,所有存放的信息都从内存中消失。当redis再启动时,会首先读取dump.rdb..

2021-12-27 22:15:14 441

原创 redis事务与锁

1.redis的事务redis是单线程的,redis的事务就是将一系列的操作封装进一个执行队列,再按照顺序去执行。redis实现事务有两部操作:第一步:组队,将要执行的操作放入队伍中第二步:执行,根据入队的顺序去执行队伍中的操作命令实现:1.1入队1.1.1输入MULTI1.1.2输入要执行的指令1.1.3若此时发现已经入队的指令有误,可以用DISCARD取消本次入队1.2 执行输入EXEC,按顺序执行队列中的指令1.3出错时的情况当指令本身出错时,队列中

2021-12-26 18:04:07 550

原创 redis配置与jedis

1.修改redis相关配置为了更好更方便的学习和使用redis,我们需要对redis的一些配置做出更改。1.1:更改网络相关设施为了远程操作redis,我们首先要更改一下redis的网络配置打开配置文件,找到netWork栏,再找到bind 127.0.0.1这行,它标识只能由本地网络访问redis。我们需要把这行注释掉。接着往下找:先找到protected-mode 一行,将yes改为no 表示关闭保护模式。到此为止,理论上我们就可以远程连接redis了。如..

2021-12-24 22:13:07 882

原创 redis数据类型

1.五大基本数据类型1.String:最简单的类型,采用key-value的形式,一个String只能存储一组信息。value允许的最大存储容量为512MB。String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。数据结构:String的实现结构类似于Java的ArrayList数组:会先分配一个默认存储容量。每次扩容时都是在当前存储容量的基础上翻倍。与ArrayList的扩容不同的是,当字符串小于1MB时,每次扩容会加倍。大于1M

2021-12-23 22:00:55 566

原创 报错记录 SpringBoot项目部署到远程服务器时发生的问题

1.打包方式传统的web项目打包时都会打成war包,放在tomcat的webapp下即可进行访问。但今天我们将打包好的war包部署到服务器时,出现了项目无法访问的情况。经查资料后发现是打包方式的原因。SpringBoot本质是以启动java类的方式来启动项目,所以应该打包成jar包来进行部署。2.端口问题最开始项目部署在服务器上用的是服务器的6000端口,部署完成后发现只有360浏览器和IE浏览器等IE内核的浏览器能够访问。后来发现是6000端口本身被许多浏览器列为了不安全端口,所以无法进行

2021-12-22 23:06:57 1010

原创 初识Redis

1.redis的下载与安装 下载我们可以去redis的官网redis.io或者中文官网redis.cn下载最新版的redis。建议去redis.io下载由于redis官方不支持windows,所以我们的安装要在Linux系统上进行安装1.首先用xftp将下载好的.tar.gz文件传输到Linux系统下的/opt文件夹下2.用tar -zxvf 对redis的压缩文件进行解压,得到一个redis-版本号 的一个文件夹3.cd进入该文件夹,我们需要对里面的...

2021-12-21 21:44:32 653

原创 java web查漏补缺 cookie的共享与重写URL

学校最近开了java web的课程,虽然已经学过相关知识,不过如今再听一遍还是收获颇丰。遂来记录一下已经忘记或之前没有接触过的知识点。1.Cookie的共享默认情况下,Cookie只能被创建它的应用所使用,但Cookie的setPath()可以允许该Cookie被指定路径所使用。示例2.URL重写当客户端禁用Cookie时,我们就可以通过URL重写技术将SESSIONID作为url参数的一部分进行传递,以实现会话追踪。URL重写的主要方法为HttpServletResponse的en

2021-12-16 22:54:43 467

原创 报错记录:The supplied file was empty (zero bytes long)

错误概述做项目时遇到的错误:The supplied file was empty (zero bytes long),提供的文件为空。项目里需要用多个方法对同一个流对象进行操作,当第一个方法进行操作时,一切正常。第二个方法再对这个流进行操作时,就无法从文件里读取信息了。解决方法也没有什么很好的解决方法,只能曲线救国了。反正操作的是同一个文件,不如在每个方法内部都新建一个对应的流。解决问题。如果大佬们有什么好的方法的话还请在评论区指出!!...

2021-12-08 11:17:59 18586 1

原创 报错记录:Current request is not a multipart request

今天做课设时遇到了一个匪夷所思的报错背景是所做的课是需要用到文件的上传与下载,在下载的时候报了Current request is not a multipart request这个错误。本来应该正常下载的文件也无法下载。从网上搜了搜,大多都是说因为没有设置响应头的Content-Type,但不管是从代码还是响应头来看,均已经设置了相关参数后来发现,是因为安装了迅雷的插件的原因。当服务器返回下载的内容时,如果在浏览器上安装了迅雷的插件的话,会自动弹出迅雷来放你下载。盲猜是因...

2021-12-05 17:38:04 573

原创 SpringBoot整合原生Servlet,Filter,Listener&数据源

1.整合三大原生组件本质就是将我们以前在web.xml中配置的组件信息转移到配置类中,这里通过RegisterBean来实现。1.注册Servlet组件:首先创建一个Servletpublic class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException

2021-11-25 18:27:31 636

空空如也

空空如也

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

TA关注的人

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