- 博客(59)
- 收藏
- 关注
原创 JDK动态代理源码解析
一、基本介绍1. 代理模式的基本介绍代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象。这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。被代理的对象可以是远程对象、创建开销大的对象或者需要安全控制的对象代理模式有不同的形式,主要有三种静态代理、动态代理(JDK代理、接口代理)和CGLIB代码(可以在内存动态创建对象,而不需要实现接口,他是属于动态代理的范畴)二、静态代理1. 静态代理模式代码的基本介绍静态代理在使用时
2021-08-08 16:06:27
910
2
原创 (3)ElasticSearch基本的查询语句
一、Search API概览1、Search API(1)URL Search在URL中使用查询参数使用“q”,指定查询字符串“query string syntax”,kv键值对(2)Request Body Search使用ElasticSearch提供的,基于JSON格式的更加完备的Query Domian Specific Language(DSL)2、指定查询的索引语法范围/_search集群上所有的索引/index1/_searchin
2021-06-27 18:49:34
725
2
原创 (2)ElasticSearch文档的基本操作与分词
一、文档的基本CRUD与批量操作1、文档的CRUD操作(1)Type名,约定都用_doc(2)Create:如果ID已经存在,会失败(3)Index:如果ID不存在,创建新的文档。否则,先删除现有的文档,在创建新的文档,版本会增加。(4)Update:文档必须已经存在,更新只会对相应字段做增量修改2、Create一个文档(1)支持自动生成文档ID和指定文档ID两种方式(2)通过调用“post movies/_doc”,系统会自动生成dociment id(3)使用http put
2021-05-15 20:58:35
457
原创 (1)ElasticSearch基本概念介绍
一、基本概念1、文档(Document)(1)ElasticSearch是面向文档的,文档是所有可能搜索数据的最小单位日志文件中的日志项一本电影的具体信息/一张唱片的详细信息MP3播放器里的一首歌/一篇PDF文档中的具体内容(2)文档会被序列化成JSON格式,保存在ElasticSearch中JSON对象由字段组成每个字段都有相应的字段类型(字符串/数值/布尔/日期/二级制/范围类型)(3)每个文档都有一个Unique ID你可以自己指定ID或者通过ElasticSearch
2021-05-10 21:40:44
372
4
原创 synchronized的锁升级过程和详细的代码演示
在了解这个知识之前先了解Java对象的内容布局一、synchronized的信息是存储在对象的markword中 Object o = new Object(); System.out.println(ClassLayout.parseInstance(o).toPrintable()); synchronized (o) { System.out.println(ClassLayout.parseInstance(o).toPrintable()); }在没有加锁之前的
2021-02-28 16:35:28
649
3
原创 CAS(compare and swap)详解,追溯到HOTSPOT源码
问:但是大家有没有想过一个问题就是其他线程修改过后的值与修改之前的值一样,就会出现ABA问题。答:只需要加个版本号就行,在修改值的时候相应的版本号加一就行,读取比较的时候随带比较以下版本好就行。问:大家想一下,一个线程在比较N和E,而且N和E相等正准备更新值为V的时候,另外一个线程正好把值改成了H,在预想中这是会出现的,但是为什么没有出现呢?答:我们可以从AtomicInteger中寻找答案,如下图:上面的方法换成上面我们设想的值如下:public final int getAndAddI.
2021-02-27 15:08:16
220
2
原创 Java中的泛型
一、泛型类(1)泛型类的定义语法class 类名称 <泛型标识,泛型标识,...> { private 泛型标识 变量名; ...... }(2)常用的泛型标识:T、E、K、V/** * @author xujin * @createtime 2021-02-14 14:29 * @description * 泛型类的定义 * <T>泛型标识-类型参数 * 创建对象的时候指定具体的数据类型 * 注意: * (1)泛型类在创建对象的时候
2021-02-17 20:28:11
302
2
原创 JAVA中对象在内存中的布局及Object o = new Object()在内存中占了多少字节
一、引入以下Jar包 <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.9</version> </dependency>二、执行以下语句Object o = new O
2021-01-10 21:37:37
181
原创 Guava Cache缓存入门
一、在什么场景下需要使用缓存呢?缓存在很多场景下都是需要使用的。比如在需要一个值的过程和代价特别高的情况下,而且对这个值的需要不止一次的情况下,我们可能就需要考虑使用缓存了。二、在什么场景下需要使用本地缓存呢?一般来说要使用本地缓存,首先,是缓存中的数据总量不会超过内存的容量。并且你愿意消耗一些内存来提升速度。三、那怎么实现本地缓存呢?一般来说我们可以直接使用jdk里提供的数据结构来作为缓存,但这样有个问题就是缓存的一些机制,比如缓存过期的淘汰策略,缓存的初始化,缓存最大容量的设置,缓存的共享等等
2020-07-11 20:18:03
405
1
原创 安装IntelliJ IDEA后必做的配置
1.设置主题2.通过鼠标滚轮来放大缩小代码3.设置鼠标的悬浮提示效果如下图:4.自动导包5.设置行号和方法间的分隔符6.忽略大小写提示7.设置类名多行显示效果图:8.设置默认的字体、字体大小、字体行间距9.设置代码注释的颜色10.修改类头的文档注释信息11.设置项目文件的编码12.设置自动编译...
2020-07-01 17:29:07
1048
1
原创 Java-NIO详解-(2)非阻塞式网络通信
1.阻塞与非阻塞(1)传统的 IO 流都是阻塞式的。也就是说,当一个线程调用 read() 或 write() 时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不 能执行其他任务。因此,在完成网络通信进行 IO 操作时,由于线程会 阻塞,所以服务器端必须为每个客户端都提供一个独立的线程进行处理, 当服务器端需要处理大量客户端时,性能急剧下降。(2)Java NIO 是非阻塞模式的。当线程从某通道进行读写数据时,若没有数 据可用时,该线程可以进行其他任务。线程通常将非阻塞 IO 的空闲时 间用
2020-06-19 13:58:23
291
原创 Java-NIO详解-(1)通道(Channel)与缓冲区(Buffer)
1.Java NIO简介Java NIO(New IO)是从Java1.4版本开始引入的一个新的IO API,可以代替标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。2.Java NIO与IO的主要区别IONIO面向流(Stream Oriented)面向缓冲区(Buffer Oriented)阻塞IO(Blocking IO)非阻塞IO(N
2020-06-18 17:03:12
902
原创 KMP算法详解
1、应用场景-字符串匹配问题(1)有一字符串str1=“BBC ABCDAB ABCDABCDABDE”,和一个子串str2=“ABCDABD”(2)现在要判断str1是否含有str2,如果存在,就返回第一次出现的位置,如果没有,就返回-12、暴力匹配算法2.1如果使用暴力匹配的思路,并假设现在str1匹配到i位置,子串str2匹配到j的位置,则有:(1)如果当前字符匹配成功(即str1[i] == str2[j]),则i++,j++,继续匹配下一个字符(2)如果匹配失败(即str1[i] !=
2020-06-06 21:10:29
274
原创 (B树、B+树和B*树)多路查找树详解
1.二叉树与B树1.1二叉树的问题分析二叉树的操作效率较高,但是也存在问题,请看下面的二叉树:(1)二叉树需要加载到内存的,如果二叉树的节点少,没什么问题,但是如果二叉树的节点很多(比如1亿),就存在以下问题:(2)问题1:再构建二叉树时,需要多次进行i/o操作(海量数据存在数据库或文件中),节点海里,构建二叉树时,速度有影响(3)问题2:节点海量,也会造成二叉树的高度很大,会降低操作速度1.2多叉树(1)再二叉树中,每个节点有数据项,最多有两个子节点。如果允许每个节点可以有更多的数据项和更
2020-05-24 20:09:44
562
原创 平衡二叉树(AVL)树详解
1.二叉排序树可能存在的问题给你一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST,如下图可以看到这是二叉排序树存在许多的问题,那怎么解决呢?用平衡二叉树(AVL)来解决.2.平衡二叉树基本介绍(1)平衡二叉树也叫做平衡二叉搜索树(Self-balancing binary search tree)又称为AVL树,可以保证查询效率较高。(2)具有以下特点:它是一颗空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一颗平衡二叉树。平衡二叉树的常用实现方法有红黑树、
2020-05-23 15:28:56
434
原创 二叉排序树(BST)的创建和删除
1.二叉排序树介绍二叉排序树:BST(Binary Sort Tree),对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,如右子节点的值当当前节点值大。如果有相同的值,可以将改节点放在左子节点或右子节点。比如针对数据{7,3,10,12,5,1,9},对应的二叉排序树为:2.二叉排序树的创建2.1思路分析:(1)先判断二叉排序树的根节点是否为空,如果为空则把当前节点复制给跟节点(2)如果不为空,则进行添加操作(3)进行添加操作时先判断当前节点的值是否大于添加节点,如果大
2020-05-22 16:59:33
424
原创 选择排序之堆排序
1.堆排序的基本介绍(1)堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。(2)堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子节点的值,称为大顶堆,注意:没有要求节点的左孩子的值和右孩子的值的大小关系。(3)每个节点的值都小于或等于其左右孩子节点的值,称为小顶堆。(4)大顶堆举例说明:(5)小顶堆举例说明2.堆排序的基本思想(1)将待排序序列构造成一个大顶堆。(2)此时,整个序列
2020-05-19 21:35:58
470
原创 二叉树遍历、查找和删除说明
1.二叉树的概念(1)数有很多种,每个节点最多只能有两个子节点的一种形式称为二叉树。(2)二叉树的子节点分为左节点和右节点(3)示意图(4)如果改二叉树的所有叶子节点都在最后一层,并且节点总数=2^n-1,n为层数,则我门称为满二叉树。(5)如果改二叉树的所有叶子节点都在最后一层或者倒数第二层,而且最后一层的叶子节点再左边连续,倒数第二层的叶子节点再右边连续,我们称为完全二叉树。2.二叉数遍历说明(1)前序遍历:先输出父节点,再遍历左子树和右子树,总结起来就是根左右。(2)中序遍历:先
2020-05-17 19:48:29
316
原创 查找算法
1.顺序查找算法顾名思义就是按照数组下标顺序进行目标元素的查找。//顺序查找public void sequentialSearch(int[] array, int target){ //顺序查找,顾名思义就是按数组的顺序来查找 for (int i = 0; i < array.length; i++) { if (array[i] == target) { System.out.println("找到匹配的元素了,它的下标为:"+i)
2020-05-17 14:40:32
156
原创 基数排序
1.基数排序介绍(1)基数排序属于”分配式排序“,又称”桶子法“,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些”桶“中,达到排序的作用。(2)基数排序属于稳定排性的排序,基数排序法是效率高的稳定性排序法。(3)基数排序是桶排序的扩展。(4)基数排序是1887年赫尔曼.何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。(5)基数排序将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到
2020-05-16 22:56:01
137
原创 归并排序
1.基本介绍归并排序(merge sort)是利用归并排序的思想实现的排序方法,该算法采用今典的分治策略。分治法将问题分成一些小的问题然后递归求解,而治的阶段将分的阶段得到的各答案和在一起,即分而治之。2.示意图3.代码演示@Testpublic void testSort(){ //我们来测一下各种排序速度 int[] array = new int[100000]; for (int i = 0; i < array.length; i++) {
2020-05-16 19:25:34
96
原创 交换排序之快速排序
1.快速排序的基本介绍快速排序(QuickSort)是对冒泡排序的一种改进。基本思想:通过一趟排序将要排序的数据分隔成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行。2.快速排序的示意图3.代码分析@Testpublic void testSort(){ //我们来测一下各种排序速度 int[] array = new int[100000]; for (int i = 0; i &
2020-05-15 22:06:06
210
原创 插入排序之希尔排序
1.直接插入排序存在的问题直接插入排序与希尔排序相比还是有一些问题的。结论:当需要插入的数是比较小的数时,后移的次数明显增多,对效率有影响。2.希尔排序的基本介绍(1)希尔排序就是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是插入排序,它是简单插入排序经过改进之后的一个更高晓的版本,也成为缩小增量排序。(2)希尔排序是把记录按下标的一定增量分组,对每个分组使用直接插入算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减少到1时,整个数组就会被分成一组,算法
2020-05-15 16:28:32
109
原创 直接插入排序算法
1.基本介绍(1)插入式排序属于内部排序法,是对与排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。(2)插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含n-1个元素,排序过程中每次从无序表中取出第一个元素,把它与有序表中的元素进行比较,将它插入到有序表中的适当位置,使之称为新的有序表。2.思路图3.代码演示@Testpublic void testSort(){ //我们
2020-05-15 15:01:39
170
原创 简单选择排序
1.基本介绍(1)选择排序也属于内部排序法,是从与排序的数据中,按指定的规则选出某个元素,再按规定交换位置后达到排序的目的。(2)选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:第一次从arr[0]-arr[n-1]中选取最小值与arr[0]交换,第二次从arr[1]-arr[n-1]中选取最小值与arr[1]交换,…,第i次从arr[i-1]-arr[n-1]中选取最小值,与arr[i-1]交换,…,第n-1次从arr[n-2]-arr[n-1]中选取最小值与arr[n
2020-05-14 23:39:27
200
原创 交换排序之冒泡排序
1.基本介绍冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下表较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底下的气泡一样逐渐向上冒。因为排序的过程中,个元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。2.示例图3.冒泡代码演示@Testpublic void testSort(){ //我们来测
2020-05-14 23:00:17
258
原创 排序算法
1.排序算法的介绍排序也称排序算法,排序是将一组数据,依指定的顺序进行排列的过程。2.排序的分类(1)内部排序:指将需要处理的所有数据都加载到内部存储器(内存)中进行排序。(2)外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储(文件等)进行排序。(3)常见的排序算法分类(见右图):3.算法的时间复杂度3.1度量一个程序(算法)执行时间的两种方法(1)事后统计的方法这种方法可行,但是有两个问题:一是要想对设计的算法的运行性能进行评测。需要实际运行该程序;二是所得时间的统计量
2020-05-14 21:48:53
149
原创 SpringBoot与定时任务
项目开发中经常需要执行一些定时任务,比如需要每天凌晨时候,分析一次前一天的信息。Spring为我们提供了异步执行任务调度的方式,提供TaskExector、TaskScheduler接口。两个注解:@EnableScheduling、@ScheduledCron表达式:字段允许值允许的特殊字符秒0-59, - * /分0-59, - * /小时0-...
2020-03-21 14:33:36
151
原创 SpringBoot整合RabbitMQ
一、概述在大多应用中,我们系统之间需要进行异步通信,即异步消息。异步消息中两个重要概念: 消息代理(message broker)和目的地(destination) 当消息发送者发送消息以后,将由消息代理接管,消息代理保证消息传递到指定目 的地。异步消息主要有两种形式的目的地1. 队列(queue):点对点消息通信(point-to-point)2. 主题(topic):发布(publ...
2020-03-12 17:14:27
169
原创 SpringBoot整合Redis
一、SpringBoot整合Redis在springBoot与缓存文章中介绍了SpringBoot默认是SimpleCacheConfiguration这个配置类生效,使用的是ConcurrentMapCacheManager缓存管理器和ConcurrentMapCache缓存组件来管理缓存,而开发中使用的是redis、memcached、ehcache等其它缓存中间件,那怎样使用Redis作为...
2020-03-10 14:24:29
260
原创 SpringBoot与缓存
一、JSR107JSR是Java Specification Requests 的缩写 ,Java规范请求,故名思议提交Java规范,大家一同遵守这个规范的话,会让大家‘沟通’起来更加轻松, JSR-107呢就是关于如何使用缓存的规范。Java Caching定义了5个核心接口,分别是CachingProvider,CacheManager,Cache,Entry和Expiry。Cachin...
2020-03-09 17:04:30
186
原创 Docker方式启动Tomcat,从外部访问却出现404错误
一、情况今天使用docker hub上拉下来的最新版tomcat运行,在外部访问却显示404错误。我们可以看到tomcat镜像是正常运行的。而我们又看到镜像打印出来的日志,并没有问题。虚拟机的防火墙和电脑的防火墙都关了。结果还是不行。但是我半年之前从docker hub拉下来的tomcat镜像运行之后,从外部是可以访问到的。二、原因随后,我分别进入了两个tomcat的目录(使...
2020-03-03 17:10:10
1886
原创 @ConditionalOnBean和@ConditionalOnMissingBean注解默认情况
我们都知道@ConditionalOnBean作用是根据value属性按bean的类型或则bean的名称判断bean是否在IOC容器中,如果在就返回true,否则返回false。而@ConditionalOnMissingBean的作用与@ConditionalOnBean相反。但是如果@ConditionalOnBean和@ConditionalOnMissingBean这两个注解没有入参...
2020-02-26 13:59:38
1770
2
原创 链表说明及代码实现
1.链表(Linked List)介绍链表是有序的列表,但是它在内存中是存储如下(1)链表是以节点的方式来存储,是链式存储。(2)每个节点包含data域,next域:指向下一个节点。(3)如图:发现链表的各个节点不一定连续。(4)链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定。(5)单链表(带头节点)逻辑结构示意图如下:...
2020-02-23 22:28:14
413
原创 SpringBoot多环境支持之Profile
1.多Profile文件我们在主配置文件编写的时候,文件名可以是application-{profile}.properties/yml我们在项目中创建application-dev.properties(代表开发时的配置文件)和application-prod.properties(生产时的配置文件)文件。application.propertiesserver.port=8081ap...
2020-02-22 13:01:31
188
原创 SpringBoot的YAML文件语法详解
1.基本语法(1)k:(空格)k:(空格)v表示一对键值对,空格必须有server: port: 8081(2)以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一层级的。server: port: 8081 address: 192.168.25.1(3)属性和值也是大小敏感。2.值的写法(1)字面量:普通值(数字,字符串,布尔)k:(空格)v:字面直接来写。...
2020-02-20 17:46:17
388
原创 @SpringBootApplication注解详解
@SpringBootApplication: Spring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot 就应该运行这个类的main方法来启动SpringBoot应用。如下代码:@SpringBootApplicationpublic class HelloWorldMainApplication { public static voi...
2020-02-20 13:48:44
1911
原创 JVM详解(5)--JMM
1.JMM定义JMM(Java内存模型Java Memory Model,简称JMM)本身是一种抽象的概念并不真实存在,它描述的是一组规范或规则,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。2.JMM关于同步的规定:(1)线程解锁前,必须把共享变量的值刷新回主内存。(2)线程加锁前,必须读取主内存的最新值到自己的工作内存。(3)j加锁解锁是同...
2020-02-17 14:29:29
173
原创 队列说明及代码实现
一、队列1.队列介绍(1)队列是一个有序列表,可以用数组或是链表来实现。(2)遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出。(3)示意图:(使用数组模拟队列示意图)2.数组模拟队列思路(1)队列本省是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如上图,其中maxSize是该队列的最大容量。(2)因为队列的输出、输入是分别从前后端来处理,因此需...
2020-02-16 22:33:56
212
原创 JVM详解(4)--GC
一、GC是什么?1.次数频繁收集Young2.次数上较少收集Old3.基本不动元空间二、GC四大算法jvm在进行GC时,并非每次都对上面三个内存区域一起回收的,大部分时候回收的是指新生代...
2020-02-15 14:49:30
203
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人