自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 mybatis中的动态代理实现它的Plugin功能

Executor代理对象的创建:我们需要知道是谁去执行我们的sql操作的:为什么要从selectList的后续开始找,因为我们的mybatis有一种写法是这样的直接调用这个方法即可:所以我们直接从selectList开始走,知道是Executor对象过后 我们去看它是如何创建代理的:1.executor是在openSession方法中创建的:2.创建executor对象:3.进入插件的功能中:4.遍历所有的对象给我们的插件添加功能5.代理对象的从创建6.继续创建代理 , 我们看到

2022-05-16 09:46:01 207 2

原创 gateway

紧接上回 创建一个gateway的项目不用添加任何类yml文件书写:#bootstrap.yml文件spring: cloud: ## Nacos认证信息 nacos: config: username: nacos password: nacos context-path: /nacos server-addr: www.gsxa.top:8848 # 设置配置中心服务端地址 names

2022-05-11 21:15:37 202

原创 netty

原文:https://www.jianshu.com/p/b9f3f6a169111.netty使用了NIO,非阻塞的具体在之前的NIO文章介绍了一点NIO。2.NIO之所以快还有一个原因就是它不会像其他的一样从Socket赋值到java的堆内存中,而是直接由操作系统开辟一个空间直接使用 所以省去了复制的时间。http的组成:所以我们不能一个HttpRequest多次处理 最好一次直接处理一个完整的FullHttpRequestpublic class HttpServer { priva

2022-05-10 19:48:56 368

原创 rabbitmq基础

安装和配置的过程省略。简单的使用:1.创建配置类(消费者和生产者都需要):/** 队列和交换机在消费者还是生产者创建都无所谓 主要是 要等两个都创建好过后才能够发消息** */@Configurationpublic class RabbitMqConfig { public static final String BUSINESS_EXCHANGE_NAME = "dead.letter.demo.simple.business.exchange"; public stat

2022-05-09 17:47:40 517

原创 seata

seata的简介可以看一看这里:http://c.biancheng.net/springcloud/seata.html我只是简单的介绍一下我使用的配置:1.下载seata服务器:https://github.com/seata/seata/releases/tag/v1.4.2下载后解压进入conf目录打开registry.conf文件 修改东西其他的我省略了registry { # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa 以什么方式来

2022-04-28 20:12:51 391 1

原创 sentinel

Sentinel 提供了一个轻量级的开源控制台 Sentinel Dashboard,它提供了机器发现与健康情况管理、监控(单机和集群)、规则管理与推送等多种功能。Sentinel 控制台提供的功能如下:查看机器列表以及健康情况:Sentinel 控制台能够收集 Sentinel 客户端发送的心跳包,判断机器是否在线。监控(单机和集群聚合):Sentinel 控制台通过 Sentinel 客户端暴露的监控 API,可以实现秒级的实时监控。规则管理和推送:通过 Sentinel 控制台,我们还能够针对

2022-04-25 10:44:11 220

原创 Nacos

nacos是一个服务注册于发现的平台 它可以做到将我们的服务展示出来 只需要去访问我们的nacos就可以浏览所有的服务。nacos的简单使用:官网地址https://nacos.io/zh-cn/docs/quick-start.html官网推荐下载稳定的2.03下载好我们的nacos包过后 将他上传到linux服务器上执行命令解压tar -xvf nacos-server-$version.tar.gz进入解压好的nacos的bin目录下启动:启动成功:可以到最下面那一行的推荐目录

2022-04-21 21:40:32 2550

原创 简答的树节点递归

给定一个节点,求出该节点内的最大距离:想法,最大距离可以根据下面三个计算 1.左子节点的最大距离 2.右子节点的最大距离 3.当前节点的最大距离private static class Node{ public Node left; public Node right; public Node(Node left,Node right){ this.left=left; this.right=right; } public Node(){ } } pr

2022-04-19 21:12:53 189

原创 NIO和BIO

BIO最原始的BIO模型 实际上就是我们以前经常使用的阻塞模型 ,在socket.accept的时候 整个程序会在此处阻塞,在read的时候也会阻塞整个线程,这样的有点是可以即使处理所有的任务,但是缺点非常明显,如果出现了高并发的情况,我们的操作系统每接收一个连接就创建一个线程,要知道线程是会占用内存的,如果创建了很多线程就会导致内存爆掉,而且很多线程 那么操作系统线程间的切换就会耗费很长的时间。public static void main(String[] args) throws Exceptio

2022-04-18 11:05:10 555

原创 Manacher求最长回文子串

按照原始的算法求最大回文字串,我们会将原始串左右两边比较 但是如果原始串的长度是偶数无法比较,比如 abba这里我们应该在哪里放中间点,所以一般会直接处理 处理为 #a#b#b#a#这样 防止出现偶数无法比较的情况,遍历每一个字符 然后左右比较最后得出最长回文字串。但是时间复杂度太高了,所以我们使用Manacher算法来帮助我们简化流程,首先我们需要了解几个概念,如图:我们为了得出最大回文半径,Manacher帮助我们如下优化:1.如果我们当前求的点在最右回文半径的外面,Manacher算法无法优化

2022-04-14 21:51:40 254

原创 KMP算法求子串的位置

首先我们给字符串规定一个东西,得出他们的结果数组 ,前缀和后缀 前缀就代表字符数组中前i个位置的字符,后缀就代表后i个位置的字符,数组的j位置就装,从j前一个字符开始的最大前缀和后缀相同的值,我们程该整型数组为nextArr:那么我们应该怎么获得这个字符串的字串的位置,两个字符串比较(s1是字符串的库,s2是想要求出现在哪个位置的字符串),如果出现了某个位置不相同的情况,我们就直接获取s2该位置的nextArr的值,查看它的最大相同前后缀的位置然后从前缀的后面一个位置开始继续和我们该位置的比较,如果再不同

2022-04-12 22:03:13 600

原创 并查集问题

这道题非常简单,直接双重for循环遍历每一个节点 查看是否是1,如果是就把改位置以及和他相邻位置的为1的节点设置为2,然后岛的数量+1即可,代码如下:public static void main(String[] args){ int arr[][]={{0,1,0,1,0,1}, {1,1,1,1,0,1}, {1,0,0,0,1,1}, {0,0,1,0,0,0}}; System.out.println(process1(arr)); } public sta.

2022-04-11 21:30:43 183

原创 ReentrantLock的源码解析

首先先观察AQS AbstractQueuedSynchronizer里面的一些属性 我们会用到://没有注释的属性暂时不用看//内部双向链表的头节点private transient volatile Node head;//尾节点private transient volatile Node tail;//一个锁的状态为 0代表没有上锁 >0代表上了锁private volatile int state;//这个是我们的AQS中的静态内部类 主要是一个双向链表static fi

2022-04-08 10:46:59 253

原创 哈希函数和哈希表

哈希函数的重要特征1.输入为无限的值 输入为有限集合2.相同的输入会有相同的输出3.不同的输入也可能会出现不同的输出(哈希碰撞 概率极低)4.获得的值是离散且平均的 就是说 在固定区域类获得的hash返回结果是平均的加入我们返回值是在1-100之间,那么输入10000个数 得到的结果 为1 或者其他的数量都基本相同,几乎是10个。哈希表:给我们40亿个数,想要求出出现次数最多的值,要求规定内存是1G,我们会对这个40亿个数求哈希值,然后%100,得到的结果就是在0,99之间,而且离散均匀分布

2022-04-06 21:16:06 289

原创 ThreadPool的相关知识

java官方提供了一个Executors来帮助我们创建线程池 但是不推荐 因为这样对线程的控制粒度比较低 我们只能传入创建的线程数量 并不能知道线程的名字和很多东西 推荐手动创建线程池创建线程池的各种参数:public ThreadPoolExecutor(int corePoolSize, 核心线程数 int maximumPoolSize, 最大线程数 long keepAliveTime, 最大空闲时间 TimeUnit unit

2022-04-06 17:08:00 700

原创 spring中的@Autowired注解

直接进入实例化bean的方法中找到一个有@Autowird注解的方法再doCreatebean中会有这么一个方法记录@Autowird注解标志的属性 保存下来,再populate中注入直接进入populate方法中看这一段代码:作用就是对我们的属性进行填充再它的inject中找到对应的属性,如果缓存中有就去缓存中拿,没有就去创建这个对象 都是调用getBean来获取,流程一致。所以这里就是先根据Type找,但是@Qualifier可以控制直接从他的value找,就只返回一个,如果没有@

2022-04-04 16:54:07 163

原创 JMM中的几个重要内容

越往上走价格越高,速度越快.以前解决cpu中数据共享问题使用的东西使用锁,数据出现不一致的情况会用锁封锁住cpu和缓存之间的通道,只有一个cpu能够通过,但是这样做 如果我cpu1只需要x 其他cpu需要y 锁把整个锁住了,没有办法访问,让数据的访问速度大大降低.后来使用了 intel公司MESI协议,其他公司有许多其他的协议,读数据的时候分为了缓存行,一行64个字节,一次读取整行的数据 方便我cpu的处理,虽然会读到无关数据,将缓存行标记为4中状态,Modified修改过数据的状态,Exclusi.

2022-03-30 17:07:08 86

原创 贪心算法的简单问题

活动选择问题 老经典了 算法书上必有的算法 根据结束时间早的排序来选:public static class Program{//活动对象 public int start; public int end; public Program(int start,int end){ this.start=start; this.end=end; } } public static class ProgramCompare implements Comparator<.

2022-03-29 21:44:17 426

原创 java的类加载器 classLoader

我们知道一个类如果需要加载,那么必然会经历类的加载器,那么类加载器有哪些:1.最顶层的类加载器,Bootstrap加载器2.加载扩展包的加载器 Extension3.加载classpath的加载器,App4.自定义的ClassLoader我们必须知道这个类加载器是层层递进的 比如bootstrap是Extension的父类 extension又是app的父类注意:此处的父类不是继承关系的父类,而是双亲委派过程中的递归层次的父类。简单的示例:public static void main(S.

2022-03-29 10:59:17 277

原创 前缀树的简单实现

所谓前缀树,就是给定一个英文的字符串数组,将这些单词以一种树的样子存入,从根节点出发如果某个字符存在,那么就创建对应的路径,不太好理解,有个图:结构如下:public static class TreeNode{ int pass;//经过这个节点的节点有多少个 int end;//以这个节点结尾的节点有多少个 TreeNode[] nexts;//这个节点下面的节点 public TreeNode(){ pass=0; end=0; nexts=new TreeNo

2022-03-28 21:44:14 191

原创 关于java中的线程

runnable相比于callable来说少了返回值,如果用callable我们能够通过它的返回值来做一些操作。两种简单的使用方法:public class callable {//相比于runnable有返回值 public static void main(String[] args) throws Exception{ /*Callable<String> callable=new Callable() {//线程的另一种执行方法 借助futureTask 它默

2022-03-25 16:56:43 634

原创 图的一些简单算法

图的结构://图 public class Graph { public HashMap<Integer,Node> nodes; public HashSet<Edge> edges; public Graph() { this.nodes = new HashMap(); this.edges = new HashSet(); } }=============================================================

2022-03-24 21:56:56 204

原创 引用的不同类型

强引用就暂时不解释了 ,我们平时new的对象都是强引用的。软引用:软引用相比与强引用来说稍微要弱一点,一个软引用的对象如果出现了内存不够的情况,那么软引用的对象会被直接回收掉。看下面的例子:public class softReference { public static void main(String[] args) { //创建软引用的对象 里面填充10M的数据 SoftReference<Byte> softReference=new Soft.

2022-03-24 19:02:54 404

原创 ThreadLocal一些解析

首先我们应该了解的基础就是ThreadLocal是本地线程的专属对象存储,不同的线程不可以共享这个对象,下面是一个简单的例子:public class threadLocalDemo1 { static ThreadLocal<Person> threadLocal=new ThreadLocal<>(); public static void main(String[] args) { new Thread(()->{

2022-03-24 18:10:08 181

原创 垃圾回收器

G1模型:在以往的垃圾回收器中,我们每次要么回收整个年轻代,要么回收整个老年代,非常的不够灵活且耗时,所以在G1中JVM将java的堆分为若干个大小相等的独立的区域叫做Region,每一个Region都可以根据需要修改为Eden,Survivor,或者老年代的空间。在回收垃圾的时候我们也是观察到哪些区域垃圾过多了就会回收该区域,并没有衡量它是那一代的。而在G1中还有一种装大对象Humongous的区域,如果你的大小超过了有一个Region容量的一半可以判断为是一个大对象,而超过了一个Region大小的对象.

2022-03-22 16:40:27 276

原创 树的一些简单算法

检查一颗树是否是搜索二叉树 当一个节点比它的左子树所有值大,比它的右子树的所有节点值小那么它就是搜索二叉树。用递归算法即可 我们根据左中右的顺序 可以知道最好使用中序遍历,先看左数是不是,如果不是直接返回false,此时我们需要比较左树的值和当前值比较如果比当前值小那么符合。同时赋值给preValue,给右子树使用。 我们细化到左子树里面其实我们知道,最后一个给preValue赋值的是最右边的的节点,这个节点一定是整棵树最大的值,细化到右边也同理。//检查一棵树是否是搜索二叉树 任意一个节点肯定.

2022-03-21 21:49:44 559

原创 树的一些简单操作

1.树的宽度优先遍历:这个没什么好说的,直接用队列即可public static void widthFirst(Node node){//使用队列即可完成宽度优先遍历 Queue<Node> queue=new LinkedList<>(); queue.add(node); while(!queue.isEmpty()){ Node temp=queue.poll(); System.out.println(temp.val); if(temp.

2022-03-18 21:26:06 220

原创 jvm垃圾回收相关的知识点

一.首先是我们判断是否是垃圾的两个算法,引用计数法和可达性分析算法。引用计数法:如果一个对象被其他对象引用,那么这个对象就会计数加1,什么时候计数为0的时候就代表了该对象未被引用,代表它是垃圾,缺点有频繁的计数,浪费性能,最重要的是如果存在循环依赖问题,他们的引用计数始终为1,但是他们可能是没有用处的,引用计数法无法处理。可达性分析算法,以我们的根上的对象为起点,向下寻找,如果找到的就是可达的对象,表明不用被清理的对象,而没有被找到的就会被清理。现在jvm主要使用的就是这个算法。二.如何清理垃圾

2022-03-18 11:18:44 397

原创 树的先种中序后序遍历

树节点://树的节点public class Node<T> { T val; public Node(T val){ this.val=val; } Node left; Node right;}先序遍历: //先序遍历 头左右 public static void firstOrder(Node node){ if(node==null) return; System.out.println(node.val);//先打印头节点 再左 最后右边

2022-03-17 21:19:43 211

原创 调停者模式

首先,调停者模式相当与各个组织之间的一种独立出来的组织,为了让我们更加好的处理复杂的逻辑关系,解开各个组织之间的耦合。uml图如下举一个例子:比如一个公司有人事部,财务部,技术部,营销部,比如说人事部想要处理一件事情,它去找财务部,财务部又让你去找技术部,但是生产技术部又让你去找营销部,最后经历了很多流程才完成了一件事情,这个时候如果又一个中间的调停者,你把这件事情交给他,那么它就可以帮你去做剩下的事情,那该多好。代码如下:调停者的父类接口://调停者的接口public interface M

2022-03-17 10:39:43 792

原创 链表的相交问题

问题:给定两个单链表,不能确定有环还是无环,判断他们是否相交,返回相交的节点时间复杂度O(n)空间O(1)。首先我们需要去判断这个单链表是无环还是有环,用一个双指针,一个走一步一个走两步,如果有环的话那么他们最终一定会相交,当遇到指向null的情况那么就表明他们无环。如何返回入环的第一个节点喃,这里有一个数学上的东西,我不会证明大家记住就好,在相遇后让快指针指向头节点当他们,都一步一步的走,当他们相等时,这两个指针指向的就是入环的第一个节点。代码如下://判断一个链表是否是环 同时返回他们的入环节点

2022-03-16 21:42:30 790

原创 链表的相关操作

一个链表的数据结构如下public class ListNode { public int val; public ListNode next=null; public ListNode rand=null; ListNode(int val){ //构造方法 :构造方法和类名相同 this.val=val; //把接收的参数赋值给当前类的val变量 }}问题:如果一个链表的next节点指向它的下一个节点,它的rand节点指向随机节点(可以为null)

2022-03-14 20:02:15 998

原创 java底层的锁相关信息

锁的升级流程首先我们都知道synchronized在jdk1.5以前的都是直接向操作系统直接申请重量级的锁,这样做很安全,但是就是会非常的慢。所以在之后的版本中我们的synchronized进行了一系列的优化,最开始出现了轻量级锁,相对与重量级锁来说是轻量的,就是不惊动我们的操作系统,通过CAS操作修改我们的对象内存地址中的markword信息来标志它为轻量级的锁(就相当与是操作系统大哥将锁直接放在门上谁拿到谁就可以开,不用来找他拿),什么是CAS操作:CAS compare and swap 它主

2022-03-14 16:36:11 972

原创 springboot的自动装配流程

相信大家在看springboot框架源码的时候一定已经看过spring的源码了吧 ,所以对于一些普通的操作我就不做解释了。直接开始正题:首先是应用程序上下文的创建,我们知道在spring中我们一般使用自己创建的xmlApplicationContext,在spring中他会根据不同的情况来创建不同的上下文类型,但是一般我们不特别配置都是servlet环境对应的上下文对象下一步实例化操作,我记得在mybatis中也有过调用构造方法创建的的对象的过程,等一下们去看一下再贴出来。观察beanDefin

2022-03-13 09:58:46 1445

原创 基数排序算法

我们获取到最大的数的位数遍历每个数的某一位的(个位或者十位等)位数,将该位数的数字放入一个数组计数器中,计算该数出现了多少次,每个位置上的数字就代表了该数字出现了几次,比如2位置上的数为1,代表2出现了依次,然后求该数组的前缀和,前缀和就是i位置上的数是前面所有位置上的数的和加上自己位置上的数,举个例子,如图:在求完前缀和过后,我们数组中的数就变成了小于等于i的数出现了几次。将我们的数放入帮助数组之中,放在哪个位置,首先倒着遍历原来的数组,为什么要倒着,等一下解释,先看如何放,每当遍历到一个数过后.

2022-03-09 22:24:06 116 1

原创 堆排序算法

首先我们需要了解大根堆的概念,如果一个数 他的左右子节点的值都比他小,那么就可以称作大根堆1.我们需要知道如何生成大根堆,遍历一个数组中所有的数,每个数都与它的父节点比较如果大于父节点,那么就和父节点更换再数组中的位置,直到它比父节点小或者没有父节点的时候结束,下面是代码: public static void heapInsert(int arr[],int index){ while(arr[index]>arr[(index-1)/2]){ swap(arr,index,(inde

2022-03-08 21:34:50 113 1

原创 归并排序算法

//归并排序 思想就是分成左右两边 分别排序 排好序过后进行一个归并过程 时间复杂度O(n*logn) public static void mergeSort(int arr[],int left,int right){ if(left==right){ return; } int mid=left+((right-left)>>1); mergeSort(arr,left,mid); mergeSort(arr,mid+1,right); Merge(ar

2022-03-06 21:38:27 151 1

原创 mybatis与spring整合过程

上一篇文章已经说了beanDefinition是通过BeanFactoryPostProcessorsr来将我们的mapper的信息注册为beanDefinition,接下来我们看一看spring是如何整合sqlSessionFactory的1.创建SqlSessionFactoryBean成为bean对象的时候调用他的afterPropertiesSet方法,并且生成sqlSessionFactory:并且我们如果进入创建sqlSessionFactory的方法中取看的话,会发现他的很多操作就是我们使

2022-03-06 17:10:39 156

原创 位运算的问题

//基础知识异或 就是将某一个数的二进制位进行运算相同位0 不同为1 a^a=0 a^0=a//问题1:如果一个数组中有一个数出现奇数次,其他数出现偶数次,请找出这个数//问题2:如果一个数组中有两个数出现奇数次,其他数出现偶数次,请找出这两个数 时间复杂度为O(n)public class Test01 { public static void compute1(int arr[]){ //如果只有一个数出现奇数次,那么我们直接对数组遍历进行位运算,出现偶数次的数直接为0,结果就是出现奇

2022-03-05 21:36:12 53

原创 二分法的几个问题

1.二分查找:就是一次二分即可//二分法 public static int BisectionMethod(int arr[],int a){ int left=0,right=arr.length-1; while(left<=right){ int mid=(left+right)/2;//取中间值 if(arr[mid]==a){ return mid; }else if(arr[mid]>a){ right=mid-1; }else

2022-03-05 21:28:04 91

空空如也

空空如也

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

TA关注的人

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