![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
往者之不谏
剑未配好,出门便是江湖
展开
-
CMS垃圾回收器与G1垃圾回收器
CMS垃圾回收器与G1垃圾回收器先上一张图CMS基本介绍cms垃圾回收器作用于老年代,采用标记清除算法,新生代回收配对的是ParNew,以最短停顿时间为目标,其回收主要经过初始标记,并发标记,重新标记,并发回收 4个阶段,下面来简单介绍下4个阶段所做的事情。初始标记:暂停所有用户线程,初始标记阶段只标记对与GCRoots直接关联的对象,所以暂停时间很短。并发标记:这一阶段根据与GCRoots直接关联的对象进行可达性分析,耗时较长,与用户线程同时进行。重新标记:暂停所有用户线程,主要处理原创 2021-10-10 21:21:30 · 608 阅读 · 0 评论 -
Zookeeper学习笔记一之配置文件,会话,节点,ACL,日志可视化
zookeeper配置文件解析# The number of milliseconds of each ticktickTime=2000 #Zk的时间单元,zk中所有的时间都是以这个时间单元为基础,进行整数倍配置的。session最小超时时间是 2*tickTime# The number of ticks that the initial # synchronization phase can takeinitLimit=10# The number of ticks that can pa原创 2021-03-29 21:49:25 · 210 阅读 · 0 评论 -
java中正则的使用与懒惰匹配和贪婪匹配
java中正则表达式的使用与懒惰匹配和贪婪匹配java正则表达式基础基本用法懒惰匹配与贪婪匹配java正则表达式基础正则表达式用来匹配特定字符串,对于需要替换掉特定字符中的特定字符串如html标签,需要注意正则表达式的懒惰匹配和贪婪匹配,懒惰匹配匹配第一个不影响后续匹配,贪婪匹配配匹所有符合的结果。基本用法中括号[]用来匹配中括号的单个字符,如a[hjkl]c可匹配 ahc,ajc,akc,alc,注意只匹配单个字符,不可匹配ahjc等。英文点符号 '.'用来匹配任意单个字符,如原创 2020-07-12 11:09:22 · 639 阅读 · 0 评论 -
java集合框架源码解析之HashMap
摘要HashMap简介HashMap数据结构HashMap源码解析HashMap简介:HashMap是一个散列表,它的底层实现是链表数组,存储的结果为键值对,key-value形式,Key允许有一个null,value允许有多个null。通过hash算法来快速定位该数据位于那条链表中。HashMap继承自AbstractMap<K,V>,所以它是一个map,它实现...原创 2018-10-11 22:24:32 · 127 阅读 · 0 评论 -
letcode 螺旋矩阵二
题目描述:螺旋矩阵 II给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。示例:输入: 3输出:[[ 1, 2, 3 ],[ 8, 9, 4 ],[ 7, 6, 5 ]]实路:和螺旋矩阵一一样,首先确定需要遍历的次数,之后就是对矩形的四条边进行填数。代码:class Solution { public int[][]...原创 2018-09-24 21:05:58 · 145 阅读 · 0 评论 -
观察者模式
观察者模式是一种很常用的设计模式,java中内置的也有观察者模式的实现(Observable类和Observer接口),来谈一下自己的一些见解。观察者模式的原理观察者模式的实现原理 : 对象间的一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象(被观察)。 以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并发生相应的变化。 比如有一个提供天气信息的API,然...原创 2018-09-13 22:46:39 · 380 阅读 · 0 评论 -
letcode 螺旋矩阵
题目描述: 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例 1:输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出: [1,2,3,6,9,8,7,4,5] 示例 2:输入: [ [1, 2, 3, 4], [5, 6, 7, 8], [...原创 2018-09-13 22:01:48 · 152 阅读 · 0 评论 -
命令模式讲解
命令模式讲解大纲命令模式原理介绍命令模式适用情况分析命令模式具体代码实现原理介绍:在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处、理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,实现二者之间的松耦合。这就是命令模式(Command P...原创 2018-09-18 15:13:14 · 451 阅读 · 0 评论 -
letcode 最接近的三数之和
题目描述: 给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2). 思路:和三数求和差不多,我...原创 2018-09-07 18:04:00 · 222 阅读 · 0 评论 -
letcode 删除排序数组中的重复项 II
题目描述: 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。示例 1:给定 nums = [1,1,1,2,2,3],函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。你不需要考虑数...原创 2018-09-10 23:46:52 · 139 阅读 · 0 评论 -
letcode 最长回文子串
题目描述: 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。示例 1:输入: “babad” 输出: “bab” 注意: “aba”也是一个有效答案。 示例 2:输入: “cbbd” 输出: “bb” 思路:寻找最长的回文子串,所以按照长度从大到小来遍历数组,判断是否符合回文字符子串,比如:输入 babad 第一次: 长度为 4 ...原创 2018-09-07 14:34:32 · 105 阅读 · 0 评论 -
抽象工厂模式
抽象工厂模式原理介绍抽象工厂模式实例介绍抽象工厂模式代码实现原理介绍:抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的...原创 2018-09-17 16:36:06 · 121 阅读 · 0 评论 -
工厂方法模式
工厂方法模式原理介绍:工厂方法模式适用举例工厂方法模式代码实现原理介绍:工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品.适用情景举例:在前文所讲的简单工厂模...原创 2018-09-17 15:56:17 · 161 阅读 · 0 评论 -
letcode 除自身以外数组的乘积
题目描述: 给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。示例:输入: [1,2,3,4] 输出: [24,12,8,6] 说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。进阶: 你可以在常数空间复杂度内完成这个题目吗?( 出于对空间...原创 2018-09-12 23:54:55 · 293 阅读 · 0 评论 -
策略模式
策略模式定义:分别封装行为接口,实现算法族,超累里面放接口对象,在子类中具体设定行为对象。原则就是:分离变化部分,封装接口,基于接口编程各种功能。此模式让行为算法的变化独立于算法的使用者。 下面使用一个例子来实现策略模式: 比如我们要描述一个鸭子类,鸭子的颜色有红色,白色,绿色,有的鸭子会飞,有的鸭子不会飞。 第一步抽象可变的部分为接口,代码:颜色://颜色接口pu...原创 2018-09-12 21:29:56 · 83 阅读 · 0 评论 -
letcode 两个排序数组的中位数
题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。你可以假设 nums1 和 nums2 不同时为空。示例 1:nums1 = [1, 3] nums2 = [2]中位数是 2.0 示例 2:nums1 = [1, 2] nums2 = [3, 4]...原创 2018-09-06 23:07:15 · 77 阅读 · 0 评论 -
letcode 子集
题目描述: 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ] 思路:此题属于动态规划问题,比如给一个数组[1,2,3]...原创 2018-09-14 13:42:19 · 161 阅读 · 0 评论 -
装饰者模式
原理: 装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。例子:通过一个卖咖啡的例子来详细了解装饰者模式,比如我们有两种咖啡Espresso和LongBlack,然后我们有两种调料(可添加到咖啡中)Milk和Chocolate。我们要设计类来实现卖咖啡的功能,这种情况使用装饰着模式来就非常好。下面我们...原创 2018-09-14 23:33:38 · 124 阅读 · 0 评论 -
letcode 搜索二维矩阵 II
题目描述:编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。示例:现有矩阵 matrix 如下:[[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[10, 13, 14, 17, 24],...原创 2019-03-01 22:50:11 · 160 阅读 · 0 评论 -
java并发学习之线程安全的计数器
线程安全的计数器实现原理简介:在java中volatile关键字可以保证共享数据的可见性,它会把更新后的数据从工作内存刷新进共享内存,并使其他线程中工作内存中的数据失效,进而从主存中读入最新值来保证共享数据的可见性,实现线程安全的计数器通过循环CAS操作来实现。就是先获取一个旧期望值值,再比较获取的值与主存中的值是否一致,一致的话就更新,不一致的话接着循环,直到成功为止.具体代码实现...原创 2018-10-21 13:23:11 · 322 阅读 · 0 评论 -
java并发编程学习之死锁
死锁的介绍:锁是一个非常有用的工具,运行场景非常多,因为它使用起来非常简单,而且易于理解。但同时它也会带来一些困扰,比如死锁问题。比如有两个线程A和B,运行都需要两个资源a,b。A获取了a资源,B获取了b资源,接着A去请求b资源,B去请求a资源,两个线程互相阻塞产生死锁。代码示例:public calss DeadLockDemo{ private static String ...原创 2018-10-20 21:39:23 · 133 阅读 · 0 评论 -
JVM内存分配及管理
本篇文章主要是介绍JVM的垃圾回收算法和JVM的内存分配机制。一.垃圾搜集算法JVM中的内存分配机制垃圾回收算法有标记-清除算法,标记-整理算法和复制算法,JVM使用分代收集算法来回收JVM分配的内存空间,分代收集算法分为新生代和老年代,主要收集JVM内存模型中的堆内存,其中新生代使用复制算法,老年代使用标记-整理算法,下面探索下垃圾回收算法的具体思想。标记-清除算法:标记清除算...原创 2018-10-22 17:29:36 · 144 阅读 · 0 评论 -
JVM内存区域划分
运行时数据区域:Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户进程的启动和结束而建立和销毁。下面是各区域的具体划分。程序计数器程序计数器是一块较小的空间,它可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时通过改变...原创 2018-10-19 12:35:14 · 88 阅读 · 0 评论 -
HashMap和HashTable的区别
本篇博客主要来比较一下hashmap和hashtable的区别。1.首先来看下继承结构:HashMappublic class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, SerializableHashtablepublic class Hash...原创 2018-10-18 15:24:58 · 128 阅读 · 0 评论 -
堆排序
堆排序介绍:堆排序可以分为两个阶段。在堆的构造阶段,我们将原始数组重新组织安排进一个堆中;然后在下沉排序阶段,我们从堆中按顺序取出所有元素并得到排序结果。1.堆的构造,一个有效的方法是从右到左使用sink()下沉函数构造子堆。数组的每个位置都有一个子堆的根节点,sink()对于这些子堆也适用,如果一个节点的两个子节点都已经是堆了,那么在该节点上调用sink()方法可以把他们合并成一个堆。我...原创 2018-10-18 14:25:38 · 117 阅读 · 0 评论 -
二叉堆实现优先队列
适用范围:许多应用程序都需要处理有序的元素,但不一定要求它们全部有序,或是不一定要一次就将它们排序。很多情况下我们会搜集一些元素,处理当前键值最大的元素等操作。优先队列实现原理:1.数据结构二叉堆能够很好地实现优先队列的基本操作。在二叉堆的数组中,每个元素都要保证大于等于另两个特定位置的元素。相应的,这些位置的元素又至少要大于等于数组中的另外两个元素。2.根节点是堆有序的二叉树中的...原创 2018-10-18 12:54:39 · 283 阅读 · 1 评论 -
java集合框架源码解析之TreeMap源码解析
asdrgfvewargerw原创 2018-10-07 23:01:25 · 244 阅读 · 0 评论 -
letcode 根据字符出现频率排序
题目描述:给定一个字符串,请将字符串里的字符按照出现的频率降序排列。示例 1:输入:“tree”输出:“eert”解释:'e’出现两次,'r’和’t’都只出现一次。因此’e’必须出现在’r’和’t’之前。此外,"eetr"也是一个有效的答案。示例 2:输入:“cccaaa”输出:“cccaaa”解释:'c’和’a’都出现三次。此外,"aaaccc"也是有效的答案。...原创 2018-10-05 23:57:31 · 206 阅读 · 0 评论 -
letcode 同构字符串
题目描述:给定两个字符串 s 和 t,判断它们是否是同构的。如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。示例 1:输入: s = “egg”, t = “add”输出: true示例 2:输入: s = “foo”, t = “bar”输出: f...原创 2018-10-04 13:35:08 · 107 阅读 · 0 评论 -
创造者模式
本篇博客来简要的讲解下创造者模式创造者模式原理创造者模式适用场景代码示例原理介绍:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。用户只需要给出指定复杂对象的类型和内容 建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来)。适用场景:需要生成的产品对象有复杂的内部结构,这些产...原创 2018-10-02 18:01:09 · 1632 阅读 · 0 评论 -
letcode 全排列
题目描述: 给定一个没有重复数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]思路:通过分析可知,这道题需要用递归求解,因为递归可以回到上一步的状态,而且,我们需要一个函数来交换数组中的两个数,之后,我们...原创 2018-09-16 22:38:33 · 247 阅读 · 0 评论 -
简单工厂模式
简单工程模式介绍简单工程模式适用情况简单工厂模式具体实现简单工厂模式介绍:简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。适用情况分析:简单工厂模式就...原创 2018-09-16 20:16:56 · 146 阅读 · 0 评论 -
经典单例模式
单例模式介绍 1. 单例模式介绍 2. 单例模式适用的情况介绍 3. 单例模式的经典实现 4. 单例模式经典实现的优化介绍:单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。适用情况:比如java中的线程池,数据库连接池,和一些硬件设备,比如打印机等,...原创 2018-09-15 23:54:24 · 429 阅读 · 0 评论 -
有向图中的可达性(深度优先)
使用深度优先搜索来解决有向图中节点的可达性问题,分为单点可达性和多点可达性。DiGraph为有向图结构,请参考上篇《邻接表的有向图》实现 单点可达:给定一副有向图和一个起点s,求是否存在一条从s到v的路径。 多点可达:给定一幅有向图和一个节点的集合,求是否存在一条从集合中的任意顶点到给定顶点的有向路径。 有向图的可达性API: public class DirectedDFS ...原创 2018-08-26 12:26:06 · 2358 阅读 · 0 评论 -
邻接表的有向图结构
有向图的定义和无向图基本相同:一幅有方向性的图是由一组节点和一组有方向的边组成的,每条有方向的边都连接着有序的一对顶点。有向图的数据类型如下: public class Digraph Digraph(int V) 创建一个V个节点0条边的有向图 int ...原创 2018-08-26 11:52:42 · 1375 阅读 · 2 评论 -
队列的链表实现
基于链表的数据结构实现队列也很简单,它将队列表示为一条从最早插入的元素到最近插入的元素的链表,实例变量first指向队列的头,实例变量last指向队列的尾。要将一个元素出列就删除表头节点。入列就在表尾节点后新增一个节点。 Queue的API public boolean isEmpty() //判断队列是否为空队列 public int size() ...原创 2018-08-08 21:46:03 · 414 阅读 · 0 评论 -
链表实现栈结构
本文来详细介绍栈结构的链表实现,链表:一种递归的数据结构它或者为空(null),或者是指向一个结点(node)的引用,该节点包含一个泛型的元素和一个指向另一条链表的引用。链表实现栈结构最大的优势就是插入,删除方便,并且不必考虑扩容问题。 节点记录:public class Node{ Item item; Node next;}栈的API: public ...原创 2018-08-08 21:24:29 · 535 阅读 · 0 评论 -
数组实现简单的栈结构
栈最大的特点就是先入后出,先看一下简单的API public int size() //返回栈中数据个数 public void push(Item item) //进栈 public Item pop() //出栈 public boolean isEmpty() //是否为空 自定义的栈要实现迭代器功能 实现 Iterable接口,需要存储所有的结构所以使用泛型。具体代码实现...原创 2018-08-08 20:54:35 · 303 阅读 · 0 评论 -
快速排序
快速排序是一种很长用的排序方法,它的基本原理就是从一组数中找出一个数,使这个数的左边都是小于这个数的,这个数的右边都是大于这个数的,通过这个数把数组分为两份,以此类推可以得到一个升序排列的数组。 代码实现:public class Quick{ public static void sort(Comparable[] a){ sort(a,0,a.length-1...原创 2018-08-12 18:28:19 · 81 阅读 · 0 评论 -
自底向上的归并排序
自底向上的归并排序和自顶向下的归并排序差不多,基本思想都是利用分治。需要注意的是管理好每次排序的lo,mid.hi的值 具体实现:public class Merge{ private Comparable[] aux; //排序 public static void sort(Comparable[] a){ aux = new Comparable...原创 2018-08-12 15:16:33 · 201 阅读 · 0 评论