<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[killerofjava的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/killerofjava</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; killerofjava]]></copyright><item><title><![CDATA[JDK动态代理源码解析]]></title><link>https://blog.youkuaiyun.com/killerofjava/article/details/119513271</link><guid>https://blog.youkuaiyun.com/killerofjava/article/details/119513271</guid><author>killerofjava</author><pubDate>Sun, 08 Aug 2021 16:06:27 +0800</pubDate><description><![CDATA[一、基本介绍
1. 代理模式的基本介绍

代理模式：为一个对象提供一个替身，以控制对这个对象的访问。即通过代理对象访问目标对象。这样做的好处是：可以在目标对象实现的基础上，增强额外的功能操作，即扩展目标对象的功能。
被代理的对象可以是远程对象、创建开销大的对象或者需要安全控制的对象
代理模式有不同的形式，主要有三种静态代理、动态代理（JDK代理、接口代理）和CGLIB代码（可以在内存动态创建对象，而不需要实现接口，他是属于动态代理的范畴）

二、静态代理
1. 静态代理模式代码的基本介绍

静态代理在使用时]]></description><category></category></item><item><title><![CDATA[（3）ElasticSearch基本的查询语句]]></title><link>https://blog.youkuaiyun.com/killerofjava/article/details/116893304</link><guid>https://blog.youkuaiyun.com/killerofjava/article/details/116893304</guid><author>killerofjava</author><pubDate>Sun, 27 Jun 2021 18:49:34 +0800</pubDate><description><![CDATA[一、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/_search
in]]></description><category></category></item><item><title><![CDATA[（2）ElasticSearch文档的基本操作与分词]]></title><link>https://blog.youkuaiyun.com/killerofjava/article/details/116612084</link><guid>https://blog.youkuaiyun.com/killerofjava/article/details/116612084</guid><author>killerofjava</author><pubDate>Sat, 15 May 2021 20:58:35 +0800</pubDate><description><![CDATA[一、文档的基本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 ]]></description><category></category></item><item><title><![CDATA[（1）ElasticSearch基本概念介绍]]></title><link>https://blog.youkuaiyun.com/killerofjava/article/details/116566274</link><guid>https://blog.youkuaiyun.com/killerofjava/article/details/116566274</guid><author>killerofjava</author><pubDate>Mon, 10 May 2021 21:40:44 +0800</pubDate><description><![CDATA[一、基本概念
1、文档（Document）
（1）ElasticSearch是面向文档的，文档是所有可能搜索数据的最小单位

日志文件中的日志项
一本电影的具体信息/一张唱片的详细信息
MP3播放器里的一首歌/一篇PDF文档中的具体内容

（2）文档会被序列化成JSON格式，保存在ElasticSearch中

JSON对象由字段组成
每个字段都有相应的字段类型（字符串/数值/布尔/日期/二级制/范围类型）

（3）每个文档都有一个Unique ID

你可以自己指定ID
或者通过ElasticSearch]]></description><category></category></item><item><title><![CDATA[synchronized的锁升级过程和详细的代码演示]]></title><link>https://blog.youkuaiyun.com/killerofjava/article/details/112445366</link><guid>https://blog.youkuaiyun.com/killerofjava/article/details/112445366</guid><author>killerofjava</author><pubDate>Sun, 28 Feb 2021 16:35:28 +0800</pubDate><description><![CDATA[在了解这个知识之前先了解Java对象的内容布局
一、synchronized的信息是存储在对象的markword中
 Object o = new Object();
 System.out.println(ClassLayout.parseInstance(o).toPrintable());

  synchronized (o) {
        System.out.println(ClassLayout.parseInstance(o).toPrintable());
  }

在没有加锁之前的]]></description><category></category></item><item><title><![CDATA[CAS（compare and swap）详解，追溯到HOTSPOT源码]]></title><link>https://blog.youkuaiyun.com/killerofjava/article/details/114173767</link><guid>https://blog.youkuaiyun.com/killerofjava/article/details/114173767</guid><author>killerofjava</author><pubDate>Sat, 27 Feb 2021 15:08:16 +0800</pubDate><description><![CDATA[问：但是大家有没有想过一个问题就是其他线程修改过后的值与修改之前的值一样，就会出现ABA问题。
答：只需要加个版本号就行，在修改值的时候相应的版本号加一就行，读取比较的时候随带比较以下版本好就行。
问：大家想一下，一个线程在比较N和E，而且N和E相等正准备更新值为V的时候，另外一个线程正好把值改成了H，在预想中这是会出现的，但是为什么没有出现呢？
答：我们可以从AtomicInteger中寻找答案，如下图：



上面的方法换成上面我们设想的值如下：
public final int getAndAddI.]]></description><category></category></item><item><title><![CDATA[Java中的泛型]]></title><link>https://blog.youkuaiyun.com/killerofjava/article/details/113807946</link><guid>https://blog.youkuaiyun.com/killerofjava/article/details/113807946</guid><author>killerofjava</author><pubDate>Wed, 17 Feb 2021 20:28:11 +0800</pubDate><description><![CDATA[一、泛型类
（1）泛型类的定义语法
class 类名称 &lt;泛型标识，泛型标识，...&gt; {
    private 泛型标识 变量名;
    ......
    }

（2）常用的泛型标识：T、E、K、V
/**
 * @author xujin
 * @createtime 2021-02-14 14:29
 * @description
 * 泛型类的定义
 * &lt;T&gt;泛型标识-类型参数
 * 创建对象的时候指定具体的数据类型
 * 注意：
 * （1）泛型类在创建对象的时候]]></description><category></category></item><item><title><![CDATA[JAVA中对象在内存中的布局及Object o = new Object()在内存中占了多少字节]]></title><link>https://blog.youkuaiyun.com/killerofjava/article/details/112442428</link><guid>https://blog.youkuaiyun.com/killerofjava/article/details/112442428</guid><author>killerofjava</author><pubDate>Sun, 10 Jan 2021 21:37:37 +0800</pubDate><description><![CDATA[一、引入以下Jar包
        &lt;dependency&gt;
            &lt;groupId&gt;org.openjdk.jol&lt;/groupId&gt;
            &lt;artifactId&gt;jol-core&lt;/artifactId&gt;
            &lt;version&gt;0.9&lt;/version&gt;
        &lt;/dependency&gt;

二、执行以下语句
Object o = new O]]></description><category></category></item><item><title><![CDATA[Guava Cache缓存入门]]></title><link>https://blog.youkuaiyun.com/killerofjava/article/details/107143657</link><guid>https://blog.youkuaiyun.com/killerofjava/article/details/107143657</guid><author>killerofjava</author><pubDate>Sat, 11 Jul 2020 20:18:03 +0800</pubDate><description><![CDATA[一、在什么场景下需要使用缓存呢？
缓存在很多场景下都是需要使用的。比如在需要一个值的过程和代价特别高的情况下，而且对这个值的需要不止一次的情况下，我们可能就需要考虑使用缓存了。
二、在什么场景下需要使用本地缓存呢？
一般来说要使用本地缓存，首先，是缓存中的数据总量不会超过内存的容量。并且你愿意消耗一些内存来提升速度。
三、那怎么实现本地缓存呢？
一般来说我们可以直接使用jdk里提供的数据结构来作为缓存，但这样有个问题就是缓存的一些机制，比如缓存过期的淘汰策略，缓存的初始化，缓存最大容量的设置，缓存的共享等等]]></description><category></category></item><item><title><![CDATA[安装IntelliJ IDEA后必做的配置]]></title><link>https://blog.youkuaiyun.com/killerofjava/article/details/107067183</link><guid>https://blog.youkuaiyun.com/killerofjava/article/details/107067183</guid><author>killerofjava</author><pubDate>Wed, 01 Jul 2020 17:29:07 +0800</pubDate><description><![CDATA[1.设置主题

2.通过鼠标滚轮来放大缩小代码

3.设置鼠标的悬浮提示

效果如下图：

4.自动导包

5.设置行号和方法间的分隔符

6.忽略大小写提示

7.设置类名多行显示

效果图:

8.设置默认的字体、字体大小、字体行间距

9.设置代码注释的颜色

10.修改类头的文档注释信息

11.设置项目文件的编码

12.设置自动编译


...]]></description><category></category></item><item><title><![CDATA[Java-NIO详解-(2)非阻塞式网络通信]]></title><link>https://blog.youkuaiyun.com/killerofjava/article/details/106842271</link><guid>https://blog.youkuaiyun.com/killerofjava/article/details/106842271</guid><author>killerofjava</author><pubDate>Fri, 19 Jun 2020 13:58:23 +0800</pubDate><description><![CDATA[1.阻塞与非阻塞
(1)传统的 IO 流都是阻塞式的。也就是说，当一个线程调用 read() 或 write() 时，该线程被阻塞，直到有一些数据被读取或写入，该线程在此期间不 能执行其他任务。因此，在完成网络通信进行 IO 操作时，由于线程会 阻塞，所以服务器端必须为每个客户端都提供一个独立的线程进行处理， 当服务器端需要处理大量客户端时，性能急剧下降。
(2)Java NIO 是非阻塞模式的。当线程从某通道进行读写数据时，若没有数 据可用时，该线程可以进行其他任务。线程通常将非阻塞 IO 的空闲时 间用]]></description><category></category></item><item><title><![CDATA[Java-NIO详解-(1)通道(Channel)与缓冲区(Buffer)]]></title><link>https://blog.youkuaiyun.com/killerofjava/article/details/106796273</link><guid>https://blog.youkuaiyun.com/killerofjava/article/details/106796273</guid><author>killerofjava</author><pubDate>Thu, 18 Jun 2020 17:03:12 +0800</pubDate><description><![CDATA[1.Java NIO简介
Java NIO(New IO)是从Java1.4版本开始引入的一个新的IO API，可以代替标准的Java IO API。NIO与原来的IO有同样的作用和目的，但是使用的方式完全不同，NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。
2.Java NIO与IO的主要区别




IO
NIO




面向流(Stream Oriented)
面向缓冲区(Buffer Oriented)


阻塞IO(Blocking IO)
非阻塞IO(N]]></description><category></category></item><item><title><![CDATA[KMP算法详解]]></title><link>https://blog.youkuaiyun.com/killerofjava/article/details/106592674</link><guid>https://blog.youkuaiyun.com/killerofjava/article/details/106592674</guid><author>killerofjava</author><pubDate>Sat, 06 Jun 2020 21:10:29 +0800</pubDate><description><![CDATA[1、应用场景-字符串匹配问题
（1）有一字符串str1=“BBC ABCDAB ABCDABCDABDE”，和一个子串str2=“ABCDABD”
（2）现在要判断str1是否含有str2，如果存在，就返回第一次出现的位置，如果没有，就返回-1
2、暴力匹配算法
2.1如果使用暴力匹配的思路，并假设现在str1匹配到i位置，子串str2匹配到j的位置，则有：
（1）如果当前字符匹配成功（即str1[i] == str2[j]）,则i++,j++，继续匹配下一个字符
（2）如果匹配失败（即str1[i] !=]]></description><category></category></item><item><title><![CDATA[(B树、B+树和B*树)多路查找树详解]]></title><link>https://blog.youkuaiyun.com/killerofjava/article/details/106304043</link><guid>https://blog.youkuaiyun.com/killerofjava/article/details/106304043</guid><author>killerofjava</author><pubDate>Sun, 24 May 2020 20:09:44 +0800</pubDate><description><![CDATA[1.二叉树与B树
1.1二叉树的问题分析
二叉树的操作效率较高，但是也存在问题，请看下面的二叉树：

（1）二叉树需要加载到内存的，如果二叉树的节点少，没什么问题，但是如果二叉树的节点很多(比如1亿)，就存在以下问题：
（2）问题1：再构建二叉树时，需要多次进行i/o操作（海量数据存在数据库或文件中），节点海里，构建二叉树时，速度有影响
（3）问题2：节点海量，也会造成二叉树的高度很大，会降低操作速度
1.2多叉树
（1）再二叉树中，每个节点有数据项，最多有两个子节点。如果允许每个节点可以有更多的数据项和更]]></description><category></category></item><item><title><![CDATA[平衡二叉树(AVL)树详解]]></title><link>https://blog.youkuaiyun.com/killerofjava/article/details/106300130</link><guid>https://blog.youkuaiyun.com/killerofjava/article/details/106300130</guid><author>killerofjava</author><pubDate>Sat, 23 May 2020 15:28:56 +0800</pubDate><description><![CDATA[1.二叉排序树可能存在的问题
给你一个数列{1，2，3，4，5，6}，要求创建一颗二叉排序树(BST，如下图

可以看到这是二叉排序树存在许多的问题，那怎么解决呢？用平衡二叉树（AVL）来解决.
2.平衡二叉树基本介绍
（1）平衡二叉树也叫做平衡二叉搜索树（Self-balancing binary search tree）又称为AVL树，可以保证查询效率较高。
（2）具有以下特点：它是一颗空树或它的左右两个子树的高度差的绝对值不超过1，并且左右两个子树都是一颗平衡二叉树。平衡二叉树的常用实现方法有红黑树、]]></description><category></category></item><item><title><![CDATA[二叉排序树(BST)的创建和删除]]></title><link>https://blog.youkuaiyun.com/killerofjava/article/details/106282242</link><guid>https://blog.youkuaiyun.com/killerofjava/article/details/106282242</guid><author>killerofjava</author><pubDate>Fri, 22 May 2020 16:59:33 +0800</pubDate><description><![CDATA[1.二叉排序树介绍
二叉排序树：BST(Binary Sort Tree),对于二叉排序树的任何一个非叶子节点，要求左子节点的值比当前节点的值小，如右子节点的值当当前节点值大。如果有相同的值，可以将改节点放在左子节点或右子节点。
比如针对数据{7，3，10，12，5，1，9}，对应的二叉排序树为：

2.二叉排序树的创建
2.1思路分析：
（1）先判断二叉排序树的根节点是否为空，如果为空则把当前节点复制给跟节点
（2）如果不为空，则进行添加操作
（3）进行添加操作时先判断当前节点的值是否大于添加节点，如果大]]></description><category></category></item><item><title><![CDATA[选择排序之堆排序]]></title><link>https://blog.youkuaiyun.com/killerofjava/article/details/106223005</link><guid>https://blog.youkuaiyun.com/killerofjava/article/details/106223005</guid><author>killerofjava</author><pubDate>Tue, 19 May 2020 21:35:58 +0800</pubDate><description><![CDATA[1.堆排序的基本介绍
(1)堆排序是利用堆这种数据结构而设计的一种排序算法，堆排序是一种选择排序，它的最坏，最好，平均时间复杂度均为O(nlogn)，它也是不稳定排序。
(2)堆是具有以下性质的完全二叉树：每个结点的值都大于或等于其左右孩子节点的值，称为大顶堆，注意：没有要求节点的左孩子的值和右孩子的值的大小关系。
(3)每个节点的值都小于或等于其左右孩子节点的值，称为小顶堆。
(4)大顶堆举例说明：

(5)小顶堆举例说明

2.堆排序的基本思想
(1)将待排序序列构造成一个大顶堆。
(2)此时，整个序列]]></description><category></category></item><item><title><![CDATA[二叉树遍历、查找和删除说明]]></title><link>https://blog.youkuaiyun.com/killerofjava/article/details/106176806</link><guid>https://blog.youkuaiyun.com/killerofjava/article/details/106176806</guid><author>killerofjava</author><pubDate>Sun, 17 May 2020 19:48:29 +0800</pubDate><description><![CDATA[1.二叉树的概念
（1）数有很多种，每个节点最多只能有两个子节点的一种形式称为二叉树。
（2）二叉树的子节点分为左节点和右节点
（3）示意图

（4）如果改二叉树的所有叶子节点都在最后一层，并且节点总数=2^n-1，n为层数，则我门称为满二叉树。

（5）如果改二叉树的所有叶子节点都在最后一层或者倒数第二层，而且最后一层的叶子节点再左边连续，倒数第二层的叶子节点再右边连续，我们称为完全二叉树。

2.二叉数遍历说明
（1）前序遍历：先输出父节点，再遍历左子树和右子树，总结起来就是根左右。
（2）中序遍历：先]]></description><category></category></item><item><title><![CDATA[查找算法]]></title><link>https://blog.youkuaiyun.com/killerofjava/article/details/106173871</link><guid>https://blog.youkuaiyun.com/killerofjava/article/details/106173871</guid><author>killerofjava</author><pubDate>Sun, 17 May 2020 14:40:32 +0800</pubDate><description><![CDATA[1.顺序查找算法
顾名思义就是按照数组下标顺序进行目标元素的查找。
//顺序查找
public void sequentialSearch(int[] array, int target){
    //顺序查找，顾名思义就是按数组的顺序来查找
    for (int i = 0; i &lt; array.length; i++) {
        if (array[i] == target) {
            System.out.println("找到匹配的元素了，它的下标为:"+i)]]></description><category></category></item><item><title><![CDATA[基数排序]]></title><link>https://blog.youkuaiyun.com/killerofjava/article/details/106166691</link><guid>https://blog.youkuaiyun.com/killerofjava/article/details/106166691</guid><author>killerofjava</author><pubDate>Sat, 16 May 2020 22:56:01 +0800</pubDate><description><![CDATA[1.基数排序介绍
(1)基数排序属于”分配式排序“，又称”桶子法“，顾名思义，它是通过键值的各个位的值，将要排序的元素分配至某些”桶“中，达到排序的作用。
(2)基数排序属于稳定排性的排序，基数排序法是效率高的稳定性排序法。
(3)基数排序是桶排序的扩展。
(4)基数排序是1887年赫尔曼.何乐礼发明的。它是这样实现的：将整数按位数切割成不同的数字，然后按每个位数分别比较。
(5)基数排序将所有待比较数值统一为同样的数位长度，数位较短的数前面补零。然后，从最低位开始，依次进行一次排序。这样从最低位排序一直到]]></description><category></category></item></channel></rss>