<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[最初的模样]]></title><description><![CDATA[一个小菜鸟]]></description><link>https://blog.youkuaiyun.com/qq_24757635</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; qq_24757635]]></copyright><item><title><![CDATA[设计模式（十四）——行为型模式——状态模式（State）]]></title><link>https://blog.youkuaiyun.com/qq_24757635/article/details/124375873</link><guid>https://blog.youkuaiyun.com/qq_24757635/article/details/124375873</guid><author>qq_24757635</author><pubDate>Sat, 30 Apr 2022 09:00:00 +0800</pubDate><description><![CDATA[定义：对有状态的对象，把复杂的“判断逻辑”提取到不同的状态对象中，允许状态对象在其内部状态发生改变时改变其行为。

应用程序中的有些对象可能会根据不同的情况做出不同的行为，我们把这种对象称为有状态的对象，而把影响对象行为的一个或多个动态变化的属性称为状态。当有状态的对象与外部事件产生互动时，其内部状态会发生改变，从而使得其行为也随之发生改变。

优点：（1）状态模式将与特定状态相关的行为局部化到一个状态中，并且将不同状态的行为分割开来，满足“单一职责原则”。

（2）减少对象间的相互依赖。将不同的状态引入独]]></description><category></category></item><item><title><![CDATA[设计模式（十三）——行为型模式——观察者模式（Observer）]]></title><link>https://blog.youkuaiyun.com/qq_24757635/article/details/124375659</link><guid>https://blog.youkuaiyun.com/qq_24757635/article/details/124375659</guid><author>qq_24757635</author><pubDate>Fri, 29 Apr 2022 10:00:00 +0800</pubDate><description><![CDATA[定义：指多个对象间存在一对多的依赖关系，当一个对象的状态发生改变时，所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式，它是对象行为型模式。

优点：（1）降低了目标与观察者之间的耦合关系，两者之间是抽象耦合关系。

（2）目标与观察者之间建立了一套触发机制。

缺点：（1）目标与观察者之间的依赖关系并没有完全解除，而且有可能出现循环引用。

（2）当观察者对象很多时，通知的发布会花费很多时间，影响程序的效率。

模式的结构与实现

实现观察者模式时要注意具体目标对.]]></description><category></category></item><item><title><![CDATA[设计模式（十五）——行为型模式——访问者模式（Visitor）]]></title><link>https://blog.youkuaiyun.com/qq_24757635/article/details/124376207</link><guid>https://blog.youkuaiyun.com/qq_24757635/article/details/124376207</guid><author>qq_24757635</author><pubDate>Fri, 29 Apr 2022 09:00:00 +0800</pubDate><description><![CDATA[定义：将作用于某种数据结构中的各元素的操作分离出来封装成独立的类，使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作，为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构进行分离，是行为类模式中最复杂的一种模式。

优点：（1）扩展性好。能够在不修改对象结构中的元素的情况下，为对象结构中的元素添加新的功能。

（2）复用性好。可以通过访问者来定义整个对象结构通用的功能，从而提高系统的复用程度。

（3）灵活性好。访问者模式将数据结构与作用于结构上的操作解耦，使得操作集合可相对自由地演]]></description><category></category></item><item><title><![CDATA[设计模式（十一）——结构型模式——组合模式（Composite）]]></title><link>https://blog.youkuaiyun.com/qq_24757635/article/details/124376066</link><guid>https://blog.youkuaiyun.com/qq_24757635/article/details/124376066</guid><author>qq_24757635</author><pubDate>Thu, 28 Apr 2022 15:00:00 +0800</pubDate><description><![CDATA[定义：又叫部分-整体模式，它是一种将对象组合成树状的层次结构的模式，用来表示“部分-整体”的关系，使用户对单个对象和组合对象具有一致的访问性。

优点：

（1）组合模式使得客户端代码可以一致地处理单个对象和组合对象，无须关心自己处理的是单个对象，还是组合对象，这简化了客户端代码；

（2）更容易在组合体内加入新的对象，客户端不会因为加入了新的对象而更改源代码，满足“开闭原则”；

缺点：（1）设计较复杂，客户端需要花更多时间理清类之间的层次关系；

（2）不容易限制容器中的构件；

（3）不容易用继承的方]]></description><category></category></item><item><title><![CDATA[设计模式（十二）——行为型模式——策略模式（Strategy）]]></title><link>https://blog.youkuaiyun.com/qq_24757635/article/details/124375265</link><guid>https://blog.youkuaiyun.com/qq_24757635/article/details/124375265</guid><author>qq_24757635</author><pubDate>Thu, 28 Apr 2022 10:00:00 +0800</pubDate><description><![CDATA[定义：该模式定义了一系列算法，并将每个算法封装起来，使它们可以相互替换，且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式，它通过对算法进行封装，把使用算法的责任和算法的实现分割开来，并委派给不同的对象对这些算法进行管理。

优点：（1）多重条件语句（比如if）不易维护，而使用策略模式可以避免使用多重条件语句。

（2）策略模式提供了一系列的可供重用的算法族，恰当使用继承可以把算法族的公共代码转移到父类里面，从而避免重复的代码。

（3）策略模式可以提供相同行为的不同实现，客户可以根据不同时间或空]]></description><category></category></item><item><title><![CDATA[设计模式（十）——结构型模式——桥接模式（Bridge）]]></title><link>https://blog.youkuaiyun.com/qq_24757635/article/details/124375980</link><guid>https://blog.youkuaiyun.com/qq_24757635/article/details/124375980</guid><author>qq_24757635</author><pubDate>Thu, 28 Apr 2022 08:00:00 +0800</pubDate><description><![CDATA[定义：将抽象与实现分离，使它们可以独立变化。它是用组合关系代替继承关系来实现，从而降低了抽象和实现这两个可变维度的耦合度。如果软件系统中某个类存在两个独立变化的维度，通过该模式可以将这两个维度分离出来，使两者可以独立扩展，让系统更加符合“单一职责原则”。

优点：由于抽象与实现分离，所以扩展能力强；其实现细节对客户透明。

缺点：由于聚合关系建立在抽象层，要求开发者针对抽象化进行设计与编程，这增加了系统的理解与设计难度。

结构与实现

可以将抽象化部分与实现化部分分开，取消二者的继承关系，改用组合关系。
]]></description><category></category></item><item><title><![CDATA[设计模式（九）——结构型模式——装饰模式(Decorator)]]></title><link>https://blog.youkuaiyun.com/qq_24757635/article/details/124360216</link><guid>https://blog.youkuaiyun.com/qq_24757635/article/details/124360216</guid><author>qq_24757635</author><pubDate>Wed, 27 Apr 2022 10:00:00 +0800</pubDate><description><![CDATA[定义：指在不改变现有对象结构的情况下，动态地给该对象增加一些职责（即增加其额外功能）的模式。

优点：（1）采用装饰模式扩展对象的功能比采用继承方式更加灵活。

（2）可以设计出多个不同的具体装饰类，创造出多个不同行为的组合。

缺点：（1）装饰模式增加了许多子类，如果过度使用会使程序变得很复杂。

装饰模式的结构与实现

通常情况下，扩展一个类的功能会使用继承方式来实现。但继承具有静态特征，耦合度高，并且随着扩展功能的增多，子类会很膨胀。如果使用组合关系来创建一个包装对象（即装饰对象）来包裹真实对象，并.]]></description><category></category></item><item><title><![CDATA[设计模式（八）——结构型模式——适配器模式(Adapter)]]></title><link>https://blog.youkuaiyun.com/qq_24757635/article/details/124359710</link><guid>https://blog.youkuaiyun.com/qq_24757635/article/details/124359710</guid><author>qq_24757635</author><pubDate>Tue, 26 Apr 2022 10:00:00 +0800</pubDate><description><![CDATA[引入：笔记本电脑的工作电压是20V，而我国的家庭用电是220V，如何让20V的笔记本电脑能够在220V的电压下工作？答案是引入一个电源适配器(AC Adapter)，俗称充电器或变压器，有了这个电源适配器，生活用电和笔记本电脑即可兼容

定义：将一个类的接口转换成客户希望的另外一个接口，使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类结构型模式和对象结构型模式两种，类结构型模式类之间的耦合度比后者高，且要求程序员了解现有组件库中的相关组件的内部结构，所以应用相对较少些，而且java不]]></description><category></category></item><item><title><![CDATA[设计模式（七）——结构型模式——代理模式（Proxy）]]></title><link>https://blog.youkuaiyun.com/qq_24757635/article/details/124338439</link><guid>https://blog.youkuaiyun.com/qq_24757635/article/details/124338439</guid><author>qq_24757635</author><pubDate>Mon, 25 Apr 2022 10:00:00 +0800</pubDate><description><![CDATA[代理模式（Proxy）

定义：由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时，访问对象不适合或者不能直接引用目标对象，代理对象作为访问对象和目标对象之间的中介。

目的：（1）保护目标对象

（2）增强目标对象。

优点：（1）代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用；

（2）代理对象可以扩展目标对象的功能；

（3）代理模式能将客户端与目标对象分离，在一定程度上降低了系统的耦合度；

缺点：（1）在客户端和目标对象之间增加一个代理对象，会造成请求处理速度变慢；]]></description><category></category></item><item><title><![CDATA[java集合详解之Vector]]></title><link>https://blog.youkuaiyun.com/qq_24757635/article/details/124371161</link><guid>https://blog.youkuaiyun.com/qq_24757635/article/details/124371161</guid><author>qq_24757635</author><pubDate>Sun, 24 Apr 2022 16:00:00 +0800</pubDate><description><![CDATA[1 特点

有序的，可以存储重复值和null值。
	底层是数组实现的，线程安全。结构与ArrayList非常相似，同样是一个线性的动态可扩容数组。
	初始容量是10，没有设置扩容增量的情况下以自身的2倍容量扩容，可以设置容量增量，初始容量和扩容量可以通过构造函数public Vector(int initialCapacity, int capacityIncrement)进行初始化。
2 源码分析

2.1 接口的定义和属性


public class Vector&lt;E&gt;
    exten]]></description><category></category></item><item><title><![CDATA[java集合详解之LinkedList]]></title><link>https://blog.youkuaiyun.com/qq_24757635/article/details/124376789</link><guid>https://blog.youkuaiyun.com/qq_24757635/article/details/124376789</guid><author>qq_24757635</author><pubDate>Sun, 24 Apr 2022 11:35:36 +0800</pubDate><description><![CDATA[1 特点

有序的，可以存储重复值和null值。
	底层是双向链表实现的，线程不安全，在进行任何位置的增删操作花费的时间都一样，不需要搬运数据，效率高，但是在查询的时候要移动指针，查询慢，不适合查询。链表不会涉及到扩容问题。
	ArrayList 对空间的消耗是要低于LinkedList，因为LinkedList要维护前后指针，还要对数据进行封装
2 源码分析



2.1 接口的定义和属性


/**
 *双向链表List，实现了 List 和 Deque接口，实现了list 接口的所有操作，并且允许所有]]></description><category></category></item><item><title><![CDATA[设计模式（六）——创建型模式——原型模式（Prototype）]]></title><link>https://blog.youkuaiyun.com/qq_24757635/article/details/124318238</link><guid>https://blog.youkuaiyun.com/qq_24757635/article/details/124318238</guid><author>qq_24757635</author><pubDate>Sun, 24 Apr 2022 10:00:00 +0800</pubDate><description><![CDATA[概念：原型模式的思想是将一个对象作为原型，对其进行复制、克隆，产生一个和原对象类似的新对象。

使用场景：主要应用与那些创建新对象的成本过大时。

优点：简化了新对象的创建过程，提高了效率，同时原型模式提供了简化的创建结构。

实现方式：（1）创建一个原型类，实现Cloneable接口，覆写clone方法，此处clone方法可以改成任意的名称，因为Cloneable接口是个空接口。深复制和浅复制都可以重写clone方法来实现。（2）深复制还可以通过序列化来实现。

引用复制：将原对象的引用直接赋给新对象，是]]></description><category></category></item><item><title><![CDATA[java集合详解之ArrayList]]></title><link>https://blog.youkuaiyun.com/qq_24757635/article/details/124362950</link><guid>https://blog.youkuaiyun.com/qq_24757635/article/details/124362950</guid><author>qq_24757635</author><pubDate>Sat, 23 Apr 2022 16:18:25 +0800</pubDate><description><![CDATA[1 特点

有序的，可以存储重复值和null值。
	底层是数组实现的，线程不安全。通过下标查询、速度快，非末尾增删的时候需要重新移动数据，所以增删性能低。
	调用构造函数new ArrayList()时，最开始是一个空数组，在第一次add的时候会创建一个初始容量为10的数组。也可以自定义初始化容量new ArrayList(int initialCapacity)。
	以自身的1.5倍容量扩容，不可以设置容量增量。
2 源码分析

2.1 接口的定义和属性


public class ArrayList&]]></description><category></category></item><item><title><![CDATA[设计模式（五）——创建型模式——建造者模式(Builder)]]></title><link>https://blog.youkuaiyun.com/qq_24757635/article/details/124317907</link><guid>https://blog.youkuaiyun.com/qq_24757635/article/details/124317907</guid><author>qq_24757635</author><pubDate>Sat, 23 Apr 2022 10:00:00 +0800</pubDate><description><![CDATA[概念：建造者模式又名生成器模式，是一种对象构建模式。它可以将复杂对象的建造过程抽象出来（抽象类别），使这个抽象过程的不同实现方法可以构造出不同表现（属性）的对象。建造者模式可以将部件和其组装过程分开，一步一步创建一个复杂的对象。用户只需要指定复杂对象的类型就可以得到该对象，而无须知道其内部的具体构造细节。

优点：（1）产品的建造和表示分离，实现了解耦。

（2）隐藏了产品的建造细节，用户只需关心产品的表示，而不需要了解是如何创建产品的。

（3）体现了开闭原则，如果需要再生产其他共享单车，只需要再开一条生]]></description><category></category></item><item><title><![CDATA[设计模式（四）——创建型模式——抽象工厂模式（Abstract Factory）]]></title><link>https://blog.youkuaiyun.com/qq_24757635/article/details/124316582</link><guid>https://blog.youkuaiyun.com/qq_24757635/article/details/124316582</guid><author>qq_24757635</author><pubDate>Fri, 22 Apr 2022 10:00:00 +0800</pubDate><description><![CDATA[介绍：抽象工厂是围绕一个超级工厂创建其他工厂，该超级工厂又称为其他工厂的工厂。提供一个相关或相互依赖对象的接口，而无需指定他们具体的类。在抽象工厂模式中，抽象产品可能是一个或多个，从而构成一个或多个产品族。在只有一个产品族的情况下，抽象工厂模式实际上退化到工厂方法模式。

定义：与工厂方法模式不同的是，工厂方法模式中的工厂只生产单一的产品，而抽象工厂模式中的工厂生产多个产品。

使用场景：系统的产品多于一个产品族，而系统只消费某一族的产品。

优点：当一个产品族中的多个对象被设计成一起工作时，它能保证客户端]]></description><category></category></item><item><title><![CDATA[设计模式（三）——创建型模式——工厂模式（Factory）]]></title><link>https://blog.youkuaiyun.com/qq_24757635/article/details/113756039</link><guid>https://blog.youkuaiyun.com/qq_24757635/article/details/113756039</guid><author>qq_24757635</author><pubDate>Thu, 21 Apr 2022 10:52:48 +0800</pubDate><description><![CDATA[工厂模式（Factory）

概念：封装对象的创建，为创建对象提供过渡接口，以便将创建对象的具体过程屏蔽隔离起来，达到提高灵活性的目的。

1、简单工程模式
]]></description><category></category></item><item><title><![CDATA[Redis——应用问题解决]]></title><link>https://blog.youkuaiyun.com/qq_24757635/article/details/124253724</link><guid>https://blog.youkuaiyun.com/qq_24757635/article/details/124253724</guid><author>qq_24757635</author><pubDate>Tue, 19 Apr 2022 15:36:21 +0800</pubDate><description><![CDATA[1 缓存穿透



2 缓存击穿



3 缓存雪崩



4 分布式锁



5 数据一致性




]]></description><category></category></item><item><title><![CDATA[数据结构与算法学习笔记——数据结构（七）：哈希表]]></title><link>https://blog.youkuaiyun.com/qq_24757635/article/details/124242069</link><guid>https://blog.youkuaiyun.com/qq_24757635/article/details/124242069</guid><author>qq_24757635</author><pubDate>Mon, 18 Apr 2022 10:35:54 +0800</pubDate><description><![CDATA[1 介绍

散列表（Hash table，也叫哈希表），根据关键码值(Key value)而直接进行访问的数据结构。 它通过把关键码值映射到表中一个位置来访问记录，以加快查找的速度。 这个映射函数叫做散列函数，存放记录的数组叫做散列表。

2 分析

哈希冲突：哈希表关键码值key是通过哈希函数计算得到一个值，这个key反映的是在数组上的位置，当key值相同的时候就是哈希冲突。

处理哈希冲突的方式：

开放寻址法：如果位置被占了，那就另外再找个位置。最基本的方法就是查看该位置的后一个位置是否可用，如果没有]]></description><category></category></item><item><title><![CDATA[数据结构与算法学习笔记——查找算法]]></title><link>https://blog.youkuaiyun.com/qq_24757635/article/details/124167088</link><guid>https://blog.youkuaiyun.com/qq_24757635/article/details/124167088</guid><author>qq_24757635</author><pubDate>Thu, 14 Apr 2022 11:55:28 +0800</pubDate><description><![CDATA[1 顺序（线性）查找

1.1 介绍

为简单的一种,既从头到尾遍历，直到直到要查询的为止。

1.2 代码实现


package com.czq.algorithm.search;

/**
 * 顺序（线性）查找
 * 适合于存储结构为顺序存储或链接存储的线性表
 *
 * @author czq
 * @date 2020/07/22
 */
public class OrderSearch {

    public static void main(String[] args) {
      ]]></description><category></category></item><item><title><![CDATA[Mysql——高级——多版本并发控制-MVCC（九）]]></title><link>https://blog.youkuaiyun.com/qq_24757635/article/details/124130901</link><guid>https://blog.youkuaiyun.com/qq_24757635/article/details/124130901</guid><author>qq_24757635</author><pubDate>Wed, 13 Apr 2022 16:56:35 +0800</pubDate><description><![CDATA[1、什么是MVCC

MVCC （Multiversion Concurrency Control），多版本并发控制。MVCC 是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在InnoDB的事务隔离级别下执行一致性读操作有了保证。MVCC就是为了查询一些正在被另一个事务更新的行，并且可以看到它们被更新之前的值，这样在做查询的时候就不用等待另一个事务释放锁。

MVCC没有正式的标准，在不同的DBMS中MVCC的实现方式可能是不同的，这里是指InnoDB中MVCC的实现机制。

2、快照读与当]]></description><category></category></item></channel></rss>