- 博客(35)
- 收藏
- 关注
原创 集合源码解析
1 ArrayList的实现原理其实就是数组,它是线程不安全的,允许其中元素为null。 public ArrayList(int initialCapacity) { if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; }...
2020-03-24 17:47:19
762
原创 string与stringbuild与stringbuffer
1 string源码源码里可以看到String被final修饰并继承了三个接口它们的值在创建后无法更改.Stringbuffers支持可变字符串。因为String对象是不可变的,所以它们可以共享public final class String implements java.io.Serializable, Comparable<String>, Char...
2020-03-24 17:47:01
204
原创 java并发编程 —— AQS
什么是AQSAQS是AbustactQueuedSynchronizer的简称,它是一个Java提高的底层同步工具类,用一个int类型的变量表示同步状态,并提供了一系列的CAS操作来管理这个同步状态。AQS的主要作用是为Java中的并发同步组件提供统一的底层支持,例如ReentrantLock,CountdowLatch就是基于AQS实现的,用法是通过继承AQS实现其模版方法,然后将子类作为...
2020-03-24 17:46:42
203
原创 Integer源码
Ingeter是int的包装类,int的初值为0,Ingeter的初值为null。 无论如何,Integer与new Integer()不会相等。不会经历拆箱过程,i8的引用指向堆,而i4指向专门存放他的内存(常量池),他们的内存地址不一样,使用 == 比较都为false。 两个都是非new出来的Integer,使用 == 比较,如果数在-128到127之间,则是true,否则为false ...
2020-03-24 17:45:52
132
原创 数据结构(1)——绪论
1 数据结构1数据元素由多个数据项组成2数据对象由性质相同的数据元素组成的集合,是数据的一个子集3数据结构是相互之间存在一种或者多种特定关系的数据元素的集合4数据结构分逻辑结构和物理结构(存储结构)2算法算法的5大特性:有穷性,确定性,可行性,输入,输出算法的时间复杂度与空间复杂度...
2019-05-19 16:02:05
114
原创 java并发编程 —— synchronized与对象头
1 synchronized关键字使用synchronized关键字有以下三种使用方式:同步代码块 同步方法 静态同步方法通过编译的class文件可以看到synchronized代码块使用了monitorenter和monitorexit两个指令分别获取锁标记和释放锁标记,而synchronized方法使用了ACC_SYNCHRONIZED来完成锁的获取与释放的。也就是锁的获取与释...
2019-03-08 10:06:29
814
原创 分布式锁
一、基于数据库的实现方式基于数据库的实现方式的核心思想是:在数据库中创建一个表,表中包含方法名等字段,并在方法名字段上创建唯一索引,想要执行某个方法,就使用这个方法名向表中插入数据,成功插入则获取锁,执行完成后删除对应的行数据释放锁。(1)创建一个表:DROP TABLE IF EXISTS `method_lock`;CREATE TABLE `method_lock` ( ...
2019-03-04 18:00:37
269
原创 java设计模式(十)—— 责任链模式
责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。servlet中的Filterservlet中...
2019-03-04 14:29:35
113
原创 java设计模式(九)—— 享元模式
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式1、如果一个系统中存在大量的相同或者相似的对象,由于这类对象的大量使用,会造成系统内存的耗费,可以使用享元模式来减少系统中对象的数量。2、对象的大部分状态都可以外部化,可以将这些外部状态传入对象中。...
2019-03-04 13:55:04
114
原创 java设计模式(八)—— 命令模式
1.命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。2.每一个命令都是一个操作:请求的一方发出请求,要求执行一个操作;接收的一方收到请求,并执行操作。3.命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。4.命令模式使请求本身成为一个对象,这个对...
2019-03-04 13:45:36
109
原创 java设计模式(七)—— 适配器模式
适配器模式与装饰器模式的区别装饰器与适配器都有一个别名叫做 包装模式(Wrapper),它们看似都是起到包装一个类或对象的作用,但是使用它们的目的很不一一样。适配器模式的意义是要将一个接口转变成另一个接口,它的目的是通过改变接口来达到重复使用的目的。而装饰器模式不是要改变被装饰对象的接口,而是恰恰要保持原有的接口,但是增强原有对象的功能,或者改变原有对象的处理方式而提升性能。所以这两个模...
2019-03-04 12:57:32
106
原创 java设计模式(六)—— 装饰器模式
其实就是一个类包装一个类传递来的对象实现https://www.cnblogs.com/jzb-blog/p/6717349.html1.抽象构件/** * 定义作为人类应有的一些规范 */public interface Human { void eating();}2.具体构件/** * 具体构件类 */public class Man i...
2019-03-03 18:57:54
128
原创 java设计模式(五)—— 原型模式
原型模式的本质是Java中的克隆技术,以某个对象为原型,复制出新的对象。通过原型模式创建的克隆对象属性值完全和原型对象相同,并且克隆出的信对象不会改变影响原型对象。原型模式的实现 (浅克隆)Cloneable接口和clone方法。一般而言,clone()方法满足: 1. 克隆对象与原对象不是同一个对象。即对任何的对象x: x.clone() != x 2.克...
2019-03-03 18:26:55
188
原创 java设计模式(四)—— 多例模式
每次都new对象,典型:数据库连接池MyConnectionsconn=MyConnections.getInstance();publicstaticMyConnectionsgetInstance(){ Randomrandom=newRandom(); currNumOfConnection=random.nextI...
2019-03-03 17:30:21
95
原创 java设计模式(三)—— 单例模式
双重检查public class Singleton { private static volatile Singleton singleton; private Singleton() {} public static Singleton getInstance() { if (singleton == null) { ...
2019-03-03 17:20:14
118
原创 java设计模式(二)—— 抽象工厂模式
1.抽象产品接口:定义产品的接口,公共的暴露方法。便于实际的产品类实现。2.具体的产品类:包含实际产品的类的逻辑处理:3.抽象工厂接口:定义产生系列对象的接口4.具体的工厂实现:实现抽象的接口工厂,返回具体的产品类的实现。下面是具体的代码示例:1.抽象的产品接口,定义了Carpackage factory.simple;/** * 抽象产品角色 ...
2019-03-03 17:12:49
149
原创 java设计模式 ——全貌
一、创建型模式1、抽象工厂模式(Abstract factory pattern): 提供一个接口, 用于创建相关或依赖对象的家族, 而不需要指定具体类.2、生成器模式(Builder pattern): 使用生成器模式封装一个产品的构造过程, 并允许按步骤构造. 将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示.3、工厂模式(factory method pat...
2019-03-03 16:52:19
114
原创 数据结构 —— 红黑树
特性 节点是红色或黑色。 根节点是黑色。 每个叶子节点都是黑色的空节点(NIL节点)。 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)。 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。 择取两篇博客:https://blog.csdn.net/sw950729/article/det...
2019-03-01 16:09:27
122
原创 数据结构 —— 哈夫曼(huffman)树和哈夫曼编码及压缩
择取两篇博客1 https://www.cnblogs.com/kubixuesheng/p/4397798.html2 https://www.cnblogs.com/liguangsunls/p/7207265.html哈夫曼树的构造(哈夫曼算法)1.根据给定的n个权值{w1,w2,…,wn}构成二叉树集合F={T1,T2,…,Tn},其中每棵二叉树T...
2019-03-01 15:02:33
382
原创 数据结构 —— B树与B+树
B树 B+树的优势有:1.单一节点存储更多的元素,使得查询的IO次数更少。(单一节点存储更多的元素是因为B+的非叶子节点不存储数据,存的是索引)2.所有查询都要查找到叶子节点,查询性能稳定。(同样是因为非叶子节点不存储数据,数据只有叶子节点有)3.所有叶子节点形成有序链表,便于范围查询。这里择取两篇博客1https://blog.csdn.net/u01110988...
2019-03-01 14:01:40
151
原创 数据结构 ——二叉查找树《BST》与平衡二叉树《AVL》
1二叉查找树定义(查找最好时间复杂度O(logN),最坏时间复杂度O(N))在二叉查找树中:(01) 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;(02) 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;(03) 任意节点的左、右子树也分别为二叉查找树。(04) 没有键值相等的节点2具体代码流程节点结构pu...
2019-03-01 13:47:02
205
原创 数据结构——二叉树
1 二叉树概念二叉树(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者有一个根节点和两颗互不相交的,方便称为根节点的左子树和右子树的二叉树组成一般的树都可以使用孩子兄弟表示法转换为二叉树表示(二)特殊的二叉树1.斜二叉树或者所有的结点都只有左子树的二叉树叫做左斜树所有的结点都只有右子树的二叉树叫做右斜树相当...
2019-02-28 14:13:11
119
原创 数据结构 ——树
1 基础知识 1.树的定义树是一种非线性的数据结构,右n(n>=0)个结点组成的有限集合,如果n=0,称为空树,如果n>0,则:有一个特定的结点被称之为跟结点(root),根结点只有直接后继,没有前驱, 除根结点外的其他结点划分为m(m>=0)个互不相交的有限集合T0,T1...Tm-1,每一个集合又是一颗子树,并称之为跟的子树。 树的示例如下:...
2019-02-28 11:14:08
662
原创 排序算法(九)总结
堆排序、快速排序、希尔排序、直接选择排序不稳定的排序算法,基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。 1 简单选择排序 是最简单直观的一种算法,基本思想为每一趟从待排序的数据元素中选择最小(或最大)的一个元素 作为首元素,直到所有元素排完为止,简单选择排序是不稳定排序。 数组末端的0要回到首位置很是费...
2019-02-27 16:53:15
149
原创 排序算法(八)归并排序
归并排序 O(n*log2n)--稳定 思想1.判断需要进入递归操作的边界值.(一般 left<right)2.把数组分成两半. Mid =(left+right)/23.进行左半边数组递归调用.直到 left=right ,不在递归.此时提取出数组的第一个元素4.进行右半边数组递归调用.5.调用merge方法,把两个有序数组合并.合并的时候会使用一个临时数组.合并的思路...
2019-02-27 16:38:59
150
原创 排序算法(七)基数排序
基数排序法是属于稳定性的排序O (nlog(r)m),其中r为所采取的基数(桶树),而m为堆数( 位数)有如下数组: 第一趟:我们首先对这个数组按照其个位数进行分组,结果如下: 然后将分组后的数据按照索引的大小取出,得到新的数组如下: 第一趟排序后完成的工作为将数组按照个位数由小到大的顺序进行了排序第二趟:对第一趟的结果按照十位数进行分组,结果如下:...
2019-02-27 15:45:52
403
原创 排序算法(六)堆排序
堆排序利用完全二叉树的选择排序(O(nlog2n)) 堆的概念在介绍堆排序之前,首先需要说明一下,堆是个什么玩意儿。堆是一棵顺序存储的完全二叉树。其中每个结点的关键字都不大于其孩子结点的关键字,这样的堆称为小根堆。其中每个结点的关键字都不小于其孩子结点的关键字,这样的堆称为大根堆。举例来说,对于n个元素的序列{R0, R1, ... , Rn}当且仅当满足下列关系之一时...
2019-02-27 15:10:47
183
原创 排序算法(五)希尔排序
希尔排序是一种插入排序(小于O(N2)),不稳定,直接插入排序改进希尔排序在数组中采用跳跃式分组的策略,通过某个增量将数组元素划分为若干组,希尔排序的基本步骤 :选择增量gap=length/2,缩小增量继续以gap = gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2...1},称为增量序列。(希尔排序的增量序列的选择与证明是个数学难题,我们选...
2019-02-27 14:47:39
281
原创 排序算法(四)快速排序
快速排序是一种交换排序( Nlog2N)最坏情况(O(N2)) 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都是比它大的数。然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。详细的图解往往比大堆的文字更有说明力,所以直接上图:上图中,演示了快速排序的处理过程:初始状态为一...
2019-02-27 14:19:54
275
原创 排序算法(三)直接插入排序
直接插入排序是一种最简单的插入排序。(O(N2))/*3,1,5,4,2第一次排序,1比3小,则1和3换位置,变为了1,3,5,4,2第二次排序,5比3大,不需要调整,仍未1,3,5,4,2第三次排序,4比5小,则4和5 换位置,此时4比3大,则不再继续调整,此时变为了1,3,4,5,2第四次排序,2比5小,2和5换位置,2又比4小,2继续和4换位置,2仍然比3小,继续和3换...
2019-02-27 14:06:18
230
原创 排序算法(二)冒泡排序
冒泡排序是一种交换排序(O(N2)) 1 冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。public class BubbleSort { public static void main(String[] args) { int[]...
2019-02-27 11:44:03
141
原创 排序算法(一)简单选择排序
简单选择排序是一种选择排序(O(N2))(1)从待排序序列中,找到关键字最小的元素;(2)如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换;(3)从余下的 N - 1 个元素中,找出关键字最小的元素,重复(1)、(2)步,直到排序结束。初始关键字:『 8,5,2,6 』 第一趟排序后:2,『8,5,6』 第二趟排序后:2,5,『8,6』 第三趟排...
2019-02-27 09:51:28
293
原创 dubbo(三)dubbo 服务暴露过程
关于dubbo服务暴露过程,首先我们之前在启动spring容器,注册自定义的dubbo的标签,解析xml时候步骤一 DubboNamespaceHandlerpublic class DubboNamespaceHandler extends NamespaceHandlerSupport { static { Version.checkDuplicate(D...
2018-12-23 18:39:23
520
原创 dubbo(二)dubbo spi机制
1 在介绍dubbo spi机制之前,我们先说一下jdk spi,spi:当服务提供者提供一个接口的多个实现的时候,一般会在META-INF/services/ 下面建立一个与接口全路径同名的文件,在文件里配置接口具体的实现类。当外部调用模块的时候的时候就能实例化对应的实现类而不需要动源码,2 为什么dubbo不直接用jdk的spi机制,而是自己模仿实现了一个spi机制呢?jdk的spi会在一...
2018-12-01 17:10:16
7393
1
原创 dubbo(一)spring schema拓展技术
在阐述dubbo原理之前,我先介绍一下dubbo与spring怎么糅合在一块,为什么dubbo标签,spring可以解析以及dubbo spi是什么,这是学习dubbo的第一步,接下来,我们会从源码的角度,进一步解析dubbo如何实现服务暴露,注册,路由,负载均衡,线程模型,mock机制,超时重试,服务发现,启动检查,令牌,优雅关机,协议,序列化,编解码,缓存,泛化,事件 等,欢迎大家指正和学习...
2018-11-30 16:38:39
407
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人