<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Shuai.Zhang]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/qq2430</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; qq2430]]></copyright><item><title><![CDATA[设计模式之原形模式]]></title><link>https://blog.youkuaiyun.com/qq2430/article/details/88142628</link><guid>https://blog.youkuaiyun.com/qq2430/article/details/88142628</guid><author>qq2430</author><pubDate>Mon, 04 Mar 2019 23:02:01 +0800</pubDate><description><![CDATA[定义
指通过拷贝原型来创建新的对象，不需要知道原型对象创建的细节，不调用构造函数
优点

原型模式性能比直接new一个对象性能高
简化创建过程

缺点

原型对象必须有克隆方法
对克隆复杂对象或克隆出的对象进行改造时，容易引入风险

代码实现
如下面的代码，我们通过原型模式来克隆一个User对象。
@Data
public class Address implements Cloneable{

...]]></description><category></category></item><item><title><![CDATA[设计模式之建造者模式]]></title><link>https://blog.youkuaiyun.com/qq2430/article/details/88140360</link><guid>https://blog.youkuaiyun.com/qq2430/article/details/88140360</guid><author>qq2430</author><pubDate>Mon, 04 Mar 2019 22:02:56 +0800</pubDate><description><![CDATA[定义
将一个复杂对象的构建与它的表示分离，使得同样的创建过程可以有不同的表示方式，用户只需要建造具体的类型就可以，而无需知道建造的具体细节。例如现在有个类有A、B、C三个属性。这个对象的构造顺序可以是A-&amp;amp;amp;amp;gt;B-&amp;amp;amp;amp;gt;C，或者是B-&amp;amp;amp;amp;gt;A-&amp;amp;amp;amp;gt;C等等
优点

封装性好，创建和使用分离
扩展性好，解耦

缺点

类中会多于出Builder类
建造的产品内部更改，建造者也]]></description><category></category></item><item><title><![CDATA[设计模式之抽象工厂模式]]></title><link>https://blog.youkuaiyun.com/qq2430/article/details/88137208</link><guid>https://blog.youkuaiyun.com/qq2430/article/details/88137208</guid><author>qq2430</author><pubDate>Mon, 04 Mar 2019 21:10:27 +0800</pubDate><description><![CDATA[定义
抽象工厂模式提供一个创建一系列相关产品的接口，抽象工厂模式通常通过工厂模式来实现
优点

与工厂模式类似，抽象工厂模式客户端无需关注具体的产品生产细节
将一系列的产品族统一到一起创建

缺点

规定了所有可能被创建的产品集合，产品族中扩展新的产品困难，需要扩展抽象工厂接口

代码实现
在上篇的博客中，我们通过了Nike/Addidas的鞋工厂来举例说明了工厂模式。这次我们进行些扩展，众所周知...]]></description><category></category></item><item><title><![CDATA[设计模式之工厂模式]]></title><link>https://blog.youkuaiyun.com/qq2430/article/details/88135633</link><guid>https://blog.youkuaiyun.com/qq2430/article/details/88135633</guid><author>qq2430</author><pubDate>Mon, 04 Mar 2019 20:32:02 +0800</pubDate><description><![CDATA[定义
定义一个创建对象的接口，但由实现这个接口的子类来决定具体实例化哪个类。工厂方法让类的实例化推迟到子类。
优点

客户端不关注产品类的创建细节
提高扩展性，符合开闭原则

缺点

类的个数容易过多

代码实现
假设现在有个鞋厂可以生产鞋，鞋的种类有Nike/Addidas。我们可以建个鞋厂，鞋的生产过程由具体的Nike/Addidas鞋厂来指定。后续鞋的种类如果新增一个NewBalance，那...]]></description><category></category></item><item><title><![CDATA[数据结构之堆]]></title><link>https://blog.youkuaiyun.com/qq2430/article/details/85219611</link><guid>https://blog.youkuaiyun.com/qq2430/article/details/85219611</guid><author>qq2430</author><pubDate>Mon, 24 Dec 2018 20:43:53 +0800</pubDate><description><![CDATA[堆就是用数组实现的二叉树，所有它没有使用父指针或者子指针。堆分为两种，最大堆和最小堆，两者的区别在于排序方式上。
堆的常用方法：
构建优先队列
支持堆排序
快速找出一个集合中的最小值（或者最大值）
最大堆

...]]></description><category></category></item><item><title><![CDATA[数据结构之线段树]]></title><link>https://blog.youkuaiyun.com/qq2430/article/details/85015955</link><guid>https://blog.youkuaiyun.com/qq2430/article/details/85015955</guid><author>qq2430</author><pubDate>Sun, 16 Dec 2018 21:27:20 +0800</pubDate><description><![CDATA[简介
线段树是一种二叉查找树，它将一个区间划分为1个个单元，树的每个节点都是1个单元。如下图的树就是一颗区间树。

性质

对于线段树中的每一个非叶子节点[a, b]，它的左节点为[a, (a+b)/2]，右节点为[(a+b)/2+1, b]。
线段数是平衡二叉树，子节点的个数等于整个区间的长度。

实现
建树
在这里，我们使用数组来实现简单的线段树，树的结构如下。
public class Se...]]></description><category></category></item><item><title><![CDATA[RocketMQ安装]]></title><link>https://blog.youkuaiyun.com/qq2430/article/details/84677672</link><guid>https://blog.youkuaiyun.com/qq2430/article/details/84677672</guid><author>qq2430</author><pubDate>Sat, 01 Dec 2018 22:42:43 +0800</pubDate><description><![CDATA[

RocketMQ下载
本文使用的是Apache RocketMQ的4.3.2版本，可以通过Apache RocketMQ官网下载源码包。



打包RocketMQ
在RocketMQ的工程下通过Maven命令进行打包，打包好的安装包在distribution工程的target目录下
mvn -Prelease-all -DskipTests clean install -U




上传安装...]]></description><category></category></item><item><title><![CDATA[数据结构之Trie]]></title><link>https://blog.youkuaiyun.com/qq2430/article/details/84672562</link><guid>https://blog.youkuaiyun.com/qq2430/article/details/84672562</guid><author>qq2430</author><pubDate>Sat, 01 Dec 2018 12:51:30 +0800</pubDate><description><![CDATA[简介
Trie，又称前缀树或字典树，是一种有序树，用于保存关联数组，其中的键通常是字符串。与二叉查找树不同，键不是直接保存在节点中，而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀，也就是这个节点对应的字符串，而根节点对应空字符串。一般情况下，不是所有的节点都有对应的值，只有叶子节点和部分内部节点所对应的键才有相关的值。——摘自维基百科

基本性质
简单来说Trie是利用字符串的公共前...]]></description><category></category></item><item><title><![CDATA[数据结构之AVL树]]></title><link>https://blog.youkuaiyun.com/qq2430/article/details/82973561</link><guid>https://blog.youkuaiyun.com/qq2430/article/details/82973561</guid><author>qq2430</author><pubDate>Sun, 25 Nov 2018 19:31:09 +0800</pubDate><description><![CDATA[在上一篇博客中，向大家介绍了二叉搜索树这一种数据结构。下面，我们来看一个问题。假设现在有一棵空树，我们先向树中添加一个根节点5，然后再添加6，然后再按顺序添加7、8。我们来看下生成的二叉搜索树是什么样子。

从上面的图中我们可以看出，二叉搜索树退化成了链表，大大的降低了查询效率。为了解决这个问题，我们引入一种新的数据结构——AVL树。
概述
AVL树是一种带有平衡条件的二叉搜索树。它的左右子树的高...]]></description><category></category></item><item><title><![CDATA[BTrace快速入门]]></title><link>https://blog.youkuaiyun.com/qq2430/article/details/82528767</link><guid>https://blog.youkuaiyun.com/qq2430/article/details/82528767</guid><author>qq2430</author><pubDate>Sun, 09 Sep 2018 12:06:27 +0800</pubDate><description><![CDATA[概述

btrace是sun的一款java动态诊断工具。可以在运行中的java类中动态的注入trace代码，这样我们就可以在不停机的情况下获取方法的入参，返回值，等信息，从而达到监控调试的目的。但是使用btrace可能导致jvm崩溃，所以才生产环境使用btrace必须要在本地验证脚本的正确性。



配置


安装：去https://github.com/btraceio/btrace下载btra...]]></description><category></category></item><item><title><![CDATA[jvm调优之jps]]></title><link>https://blog.youkuaiyun.com/qq2430/article/details/82154044</link><guid>https://blog.youkuaiyun.com/qq2430/article/details/82154044</guid><author>qq2430</author><pubDate>Mon, 03 Sep 2018 20:03:35 +0800</pubDate><description><![CDATA[概要

jps [ options ] [ hostid ]


options:命令行选项。
hostid:主机标识，可以是ip地址或者域名。


用于查看虚拟机进程，如果未指定hostid，则查看本地的jvm进程。如果指定hostid，将查看指定主机上的jvm进程。

options


不添加options的时候，默认输出进程ID，简单的class名称或者jar名称。 

-q：仅输出进程I...]]></description><category></category></item><item><title><![CDATA[jvm调优之jstack]]></title><link>https://blog.youkuaiyun.com/qq2430/article/details/82319958</link><guid>https://blog.youkuaiyun.com/qq2430/article/details/82319958</guid><author>qq2430</author><pubDate>Sun, 02 Sep 2018 21:59:40 +0800</pubDate><description><![CDATA[概述

jstack [ options ] pid


options：命令行选项
pid：进程ID


jstack命令可以用来查看线程堆栈。根据堆栈信息我们可以定位程序出现的问题，例如CPU偏高等问题。本文使用的是JDK10，不同版本间可能存在差异。



options

l：输出有关锁的其他信息。



[root@izbp1chtb8a3vd2mzvuawlz target]# jst...]]></description><category></category></item><item><title><![CDATA[jvm调优之jmap]]></title><link>https://blog.youkuaiyun.com/qq2430/article/details/82318505</link><guid>https://blog.youkuaiyun.com/qq2430/article/details/82318505</guid><author>qq2430</author><pubDate>Sun, 02 Sep 2018 20:16:59 +0800</pubDate><description><![CDATA[概要

jmap [options] pid


options：命令行选项
pid：进程ID


jmap命令可以查看堆内存的详细情况，以及生成heap dump文件等。本文使用的是JDK10，不同版本间可能存在差异。



options

clstats：查看Java堆的类加载器统计信息。

[root@izbp1chtb8a3vd2mzvuawlz /]# jmap -clstats 11...]]></description><category></category></item><item><title><![CDATA[jvm调优之jstat]]></title><link>https://blog.youkuaiyun.com/qq2430/article/details/82290543</link><guid>https://blog.youkuaiyun.com/qq2430/article/details/82290543</guid><author>qq2430</author><pubDate>Sun, 02 Sep 2018 00:17:52 +0800</pubDate><description><![CDATA[概要

jstat -outputOptions [-t] [-hlines] vmid [interval] [count]]


outputOptions：命令行选项
t：输出时间戳（以jvm启动开始从0统计）
hlines：每输出lines数量的数据后，输出一次header信息
vmid：进程ID
interval：输出的时间间隔，秒或者毫秒
count：输出次数


jstat命令可以查...]]></description><category></category></item><item><title><![CDATA[jvm调优之jinfo]]></title><link>https://blog.youkuaiyun.com/qq2430/article/details/82154442</link><guid>https://blog.youkuaiyun.com/qq2430/article/details/82154442</guid><author>qq2430</author><pubDate>Sat, 01 Sep 2018 13:02:58 +0800</pubDate><description><![CDATA[概要

jinfo [ options ] [ pid]


options：命令行选项。
pid：进程ID。


用于输出JAVA配置信息，配置信息包括Java System属性和JVM的参数。也可以在运行时修改部分参数。...]]></description><category></category></item><item><title><![CDATA[数据结构之二叉搜索树]]></title><link>https://blog.youkuaiyun.com/qq2430/article/details/81416047</link><guid>https://blog.youkuaiyun.com/qq2430/article/details/81416047</guid><author>qq2430</author><pubDate>Sun, 26 Aug 2018 00:12:51 +0800</pubDate><description><![CDATA[在前面的几章中，介绍了几种线性数据结构，主要包含数组、栈、队列、链表等。从本节开始，给大家介绍树这种数据结构。

在数据结构中，包括很多的树结构，像二叉树、二叉搜索树、线段树、字典树、红黑树等。本小节介绍的是二叉树和二叉搜索树，其余的树结构，会在后面的文章中再进行介绍。



树

在介绍二叉树之前，我们先准备些预备知识。

首先来看先什么是树。一颗树可以看做是由根节点（root）和以及0个或多个...]]></description><category></category></item><item><title><![CDATA[数据结构之链表]]></title><link>https://blog.youkuaiyun.com/qq2430/article/details/81198266</link><guid>https://blog.youkuaiyun.com/qq2430/article/details/81198266</guid><author>qq2430</author><pubDate>Wed, 25 Jul 2018 19:30:17 +0800</pubDate><description><![CDATA[在前面的博客中，我们知道了数组这种数据结构的随机访问能力强，但是因为创建数组后，数组的容量时固定的。过大，容易造成空间浪费，过小，又不能满足存储需要。

本篇文章给大家介绍另一种线性数据结构——链表。

链表与数组不同，链表在物理存储上是非连续的。链表中的节点可以分为两部分，一个是存储的元素值，另一部分是指向下一个节点的指针。



单链表

单链表中的每个节点分为两个部分，一个是存储的数据值，另...]]></description><category></category></item><item><title><![CDATA[数据结构之队列]]></title><link>https://blog.youkuaiyun.com/qq2430/article/details/81085954</link><guid>https://blog.youkuaiyun.com/qq2430/article/details/81085954</guid><author>qq2430</author><pubDate>Tue, 17 Jul 2018 18:03:41 +0800</pubDate><description><![CDATA[队列简介

队列简单来说就是一种允许再一段进行插入，再另一端进行删除操作的线性表，就像排队取票一样。插入的一段我们称之为队尾，删除的一端我们称之为队首。队列具有FIFO（先进先出）的特性。队列的结构图如下所示。



队列的简单实现

使用上一篇文章的动态数组实现了队列，代码非常简单，不多讲了。

public class ArrayQueue {

    private Array&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;E&]]></description><category></category></item><item><title><![CDATA[数据结构之栈]]></title><link>https://blog.youkuaiyun.com/qq2430/article/details/81084415</link><guid>https://blog.youkuaiyun.com/qq2430/article/details/81084415</guid><author>qq2430</author><pubDate>Tue, 17 Jul 2018 16:54:50 +0800</pubDate><description><![CDATA[栈的简介

栈简单来说就是一种只允许在一端进行插入和删除操作的线性表，这一端我们通常称作栈顶，而另一端称作栈底。插入和删除也被称为入栈和出栈。因为栈只允许在一端进行操作，所以它具有FILO（先进后出）的特性，栈的结构图如下所示。



栈的简单实现

使用上一篇文章的动态数组实现了栈，代码非常简单，不多讲了。



public class ArrayStack&amp;amp;amp;lt;E&amp;amp;amp;gt;{

    pr...]]></description><category></category></item><item><title><![CDATA[数据结构之数组]]></title><link>https://blog.youkuaiyun.com/qq2430/article/details/81017173</link><guid>https://blog.youkuaiyun.com/qq2430/article/details/81017173</guid><author>qq2430</author><pubDate>Thu, 12 Jul 2018 16:21:35 +0800</pubDate><description><![CDATA[数组简介

首先我们来简单的了解下什么是数组，数组是在内存中开辟出一段连续的空间用来存储数据，如下图所示。



既然是用来存储数据，就涉及到寻址问题，我们来看下数组是如何寻址的。因为是一段连续的空间，那么只要知道首地址和数组下标就可以计算出要查询数组元素的内存地址。比如说数组的首地址0x0001，数组中每个元素占4个字节，那么下标为1的地址为0x0005。

也就是因为这个原因，在数组中查询元素...]]></description><category></category></item></channel></rss>