自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 浅析ZooKeeper的Watcher机制

Watcher是实现ZooKeeper的发布/订阅功能最核心的一个角色。当我们需要对ZooKeeper的某一个节点的变化做出后续处理时,就需要使用到Watcher。ZooKeeper的Watcher机制,总的来说可以分为三个流程:client注册Watcher,server处理Watcher,client回调Watcher。接下来我将从上面三个流程分析Watcher是如何工作的。Cli...

2018-06-03 19:44:29 1525

原创 CyclicBarrier源码浅析

本文所使用的源码版本是JDK1.7CyclicBarrier是什么?JDK1.7中的介绍如下: A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point. CyclicBarriers are usefu...

2018-05-20 16:08:17 181 1

原创 面试中遇到的手撕代码(二)

8.栈的最大值问题问题的描述和思路可以参考这里Java实现代码如下:import java.util.Stack;/** * 栈的最大值问题 Title: Description: Company: * * @author 郑伟 * @date 2018年4月12日下午8:57:29 */public class SpecialStack { Stack<Integer> sta

2018-04-12 21:36:45 1418

原创 TopK问题的Java实现

面试中会经常遇到手撕代码的情况,而求TopK的是经常遇到的题目。下面我就用Java来实现。主要通过两种方法实现,快排思想以及堆排序的思想,两者的复杂度为O(NlogK)。基于快排的TopK实现:import java.util.Arrays;/** * 使用快排实现的TopK问题 Title: Description: Company: * * @author 郑伟 * @date 201

2018-04-11 10:57:11 1759

原创 面试中遇到的手撕代码题(一)

1.重建二叉树输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。根据二叉树的性质: public class Rebuild_Tree { public TreeNode reConst...

2018-04-01 12:58:35 9798

原创 19届阿里实习一面面经

面经内容如下应该是简历评估面,全程 38分9秒,记录如下: 面试官看过我的博客和我写过的代码,说博客还不是很多(回答主要都写在CSDN上了,给面试官点一个赞,然后有关于博客上写了的就都没有问) 1.你是非专业的,如何规划学习,平常如何接触计算机行业?在学校有什么突破性的研究成果? 2.为什么想到转计算机这一块,而且花这么多学Java?(回答热爱互联网自由、开放的氛围) 3.谈谈当前互联...

2018-03-21 13:25:31 423

原创 动态规划案例解析

此文总结了本人在刷LeetCode是遇到的动态规划问题以及对应的解法。word-breakGiven a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words. For ...

2018-03-01 16:02:36 118

原创 DFS原理与案例

最近刷leetcode时遇到了好多DFS的题目,一开始的迷茫,只能看着答案一步一步的分析,而现在,对于DFS这类题目有了自己的一些见解。 首先DFS是什么呢? D—depth,F—first,S—serach,形象一点的讲法就是一条道路走到黑,直到走到终点或者前面没有路,可以理解为一根筋。DFS算法大同小异,只要抓住其核心思想,那么关于DFS的题目在你看来就像是一个模子刻出来的。那么其

2018-01-28 15:55:35 213

原创 命令模式

模式定义:将请求封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。目的:解决命令的请求者和命令的实现者之间的耦合关系。也就是说命令发起者不需要执行相应的命令,而是交给别人去做。优点: 对多个命令的统一控制。我们可以将命令发起者比作公司的老板,他不需要亲自去招聘人才,也不需要亲自去做财务报表,需要做的只是发出两个命令“HR去招聘人才;财务去做本年度财务报表”即可,这些命

2018-01-06 16:12:41 146

原创 深入理解MyBatis——缓存

MyBatis中使用缓存来提高其性能。MyBatis中的缓存分为两种:一级缓存和二级缓存。使用过MyBatis的可能听到过这样一句话“一级缓存是sqlSession级别的,二级缓存是mapper级别的”。这也说明了,当使用同一个sqlSession时,查询到的数据可能是一级缓存;而当使用同一个mapper是,查询到的数据可能是二级缓存。MyBatis中的一级缓存由前面的文章可以知道

2018-01-05 21:53:47 20826 3

原创 深入理解MyBatis——数据源和事务管理

在使用MyBatis是,我们需要配置数据源,常用的数据源有c3p0,dbcp,druid等。打开源码会发现,他们都实现了javax.sql.DataSource接口。实质上,MyBatis中数据源可以分为三类,UNPOOLED、POOLED和JNDI类。使用UnpooledDataSource,PooledDataSource来分别表示前两种数据源,两者都实现了javax.sql.DataSo

2018-01-05 20:24:13 2174

原创 深入理解MyBatis——初始化

我们知道使用MyBatis前是需要初始化的,我们来看一段代码:String resource = "mybatis.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuil

2018-01-05 17:39:51 408

原创 深入理解MyBatis——查询流程

MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单、优雅。本文主要讲述MyBatis的架构设计思路,然后探究MyBatis的是如何实现查询的。MyBatis执行流程利用MyBatis实现一次查询 InputStream inputStream = Resources.getResourceAsStream("mybatisConfig.

2018-01-05 16:27:11 281

原创 观察者模式

模式简介模式定义:观察者模式定义了对象之间的一对多依赖,这样一来,当一对象改变状态时,它的所有依赖都会收到通知。打个比方:一家报社有很多用户,当报社发发布了新的报纸时,这些订阅的读者都能收到。报社就是一的一方,用户就是多的一方。当用户需要订阅报纸,只需要在报社注册即可。Subject就好比于报社的角色,Obsever就好比于订阅此报社的用户。为什么使用接口而不是具体类?为了

2018-01-04 17:05:59 153

原创 适配器模式

简介适配器模式定义:将一个类的接口,转换成客户期望的另一个接口,适配器让原本不兼容的类可以合作无间。类图:适配器实现了目标类的接口,但是通过组合,使得适配器持有被适配者的实例,当客户需要执行目标类的方法methodA()时,通过适配器使得真正执行的是被适配者的方法。实例Target.javapublic interface Target { void methodA(); void

2018-01-03 16:08:55 109

原创 秒杀实现

秒杀流程1.用户首先进入商品秒杀页面,当到达秒杀时间时前端的下单按钮才能点亮;2.点击以后并不是所有用户都能到达下单页面,1W+用户同时下单可能就只有20个用户才能进入下单页面,其他的用户直接到达秒杀结束页面,此时步骤可以使用Redis的单线程特性来统计和控制下单人数;3.成功进入填写订单页面的用户填写完订单以后再次提交订单,虽然此时并发请求数量最多只有20,但是我们还是需要使用Redis的单线程特

2018-01-03 14:13:19 417

原创 装饰器模式

本篇主要介绍常用的一个设计模式——装饰器模式。简介装饰器模式:动态的将责任加到对象上,能扩展对象的功能,且比使用继承来达到扩展对象的功能更有弹性。应用场合:设计的类数量过多、设计死板且父类加入的功能子类不能全部适用。

2018-01-02 18:59:31 157

原创 Redis实现消息队列

能实现消息队列的中间件有很多啊,kafka,RabbitMQ,RocketMQ等,不知道为什么还要利用Redis去实现消息队列的功能呢?Redis实现消息队列和上述专业的消息队列中间件比,没有什么优势。所以,还是别用Redis实现了。如果你还坚持使用Redis来实现,那么好吧,接下来就介绍用Redis如何实现消息队列吧!PUSH/POPRedis中五大数据结构之一—列表,其PUSH和POP命令遵循F

2017-12-28 15:02:40 2972

原创 单例模式

单利模式有很多种实现方式,每一种方式都有自己合适的场合。常用的单利有:懒汉式、饿汉式、线程安全式、双重检查式和登记式。实现单利最重要的一点是构造方法是private的,这使得实例不能被外界所创建。懒汉式这是最简单的一种单利模式,但是带来的问题是线程不安全。这里所谓的不安全是指在创建第一个实例时是线程不安全的。可以看到,当我们初次使用时才会创建实例,所以叫懒汉式。public class Simple

2017-12-26 15:52:34 19259

原创 工厂模式

作为常见的设计模式,工厂模式可以分为三类。简单工厂、工厂方法以及抽象工厂模式。下面我将以代码示例来解释。简单工厂最简单的一种工厂模式,概括起来就是有一个工厂类,客户端需要什么,此工厂就生产什么。//商品接口public interface Products {}//商品Apublic class ProductsA implements Products { public Products

2017-12-26 14:49:49 176

原创 使用位运算实现加减乘除

经常看到类似”不使用XXX符号的前提下,实现加、减、乘、除“?第一次遇见的同学可能会懵,如果你记起来一个叫位运算的东西就会豁然开朗了。算法概述加法:比如5+6。小学的时候数学老师告诉我们的是,先求不算进位的值,也就是1,然后再将进位结果(这里是1)加入,直到进位为0。使用位运算也是同样的道理。只不过我们对于进位和不进位的结果的产生感到陌生而已。位运算中两个数相加的不进位结果:a^b,进位结果a&b;

2017-12-25 17:40:45 286

原创 红黑树的插入3张图让你学会

红黑树的插入相比较其删除是比较简单的。总的分为两步: 第一步,找到节点位置,插入节点即可,默认插入的节点是红色的(这样不会影响平衡)。 第二步,将调整颜色,避免出现红—红的出现,这是红黑树不允许的。再次强调红黑树的定义: (1)每个节点或者是黑色,或者是红色。 (2)根节点是黑色。 (3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!] (

2017-12-24 17:26:55 190

原创 红黑树的删除—10张图学会

如果要学红黑树,那么就必须知道二叉树,毕竟红黑树本身就是一个二叉搜索树。只不过红黑树比一般的二叉搜索树更加稳定,也就是更加平衡,但是有没有AVL树那么的稳定,这换来的是红黑树比AVL数有更好的插入和删除效率,但是查找效率并没有比AVL差很多。下文我将用RBT代替红黑树。二叉搜索树的删除介绍RBT的删除,就先要知道二叉搜索树的删除(知道的同学可以直接跳过)。删除分为四步: 1.找到删除点假设为X

2017-12-23 15:21:12 12253 9

原创 Redis事务机制和分布式锁

Redis事务机制严格意义来讲,Redis的事务和我们理解的传统数据库(如mysql)的事务是不一样的;Redis的事务实质上是命令的集合,在一个事务中要么所有命令都被执行,要么所有事物都不执行。 一个事务从开始到执行会经历以下三个阶段:开始事务。命令入队。执行事务。在MySQL中我们使用START TRANSACTION 或 BEGIN开启一个事务,使用COMMIT提交一个事务;而在Re

2017-12-19 13:28:01 13044 3

原创 Redis数据结构及其常用命令

Redis中数据结构有五种,分别是字符串、链表、集合、散列、有序集合,接下来我简单介绍这五种数据结构以及相应的操作命令。String在Redis中,字符串可以存储三种类型:字节串整数浮点数常用操作命令:set:设置键-值get:获得键对应的值del:删除给定键的值自增自减命令:incr:加一incrby:加上某一整数decr:减一decrby:减去某一个数incrbyflo

2017-12-18 22:31:41 241

原创 贪心算法例题

简介贪心算法(greedy)分阶段地工作,在每一个阶段都可以认为所做的决定是最好的,而不用考虑后果。这就意味着得到的是局部最优解决方案,当算法结束时,如果一个一个局部最优解能组成全局最优解决,那么就说明这个算法是正确的;如果不是,则此算法的到的结果就是一个次优解。因此,如果使用贪婪算法得到问题的最优解,那么问题就必须满足一定的条件。找零钱问题这个问题在我们的日常生活中非常普遍了。假设1元、2元、5元

2017-12-18 13:24:23 543

原创 Spring之IOC的实现

在Springl下如果我们需要使用某一个bean,我们不需要手动的new一个,而是问Spring的BeanFactory拿一个你需要的Bean即可,这就是所谓的IOC,Spring控制了Bean的创建和毁灭,我们只需要问Spring拿即可。BeanFactory bf = new XmlBeanFactory(new ClassPathResource("beanFactory.xml"));Be

2017-12-15 22:43:00 159

转载 动态规划:最长子序列问题

关于动态规划中的最长子序列问题有很多优秀的解读,在这里推荐一位博主的关于最长子序列的文章,非常不错,配有大量的图片和文字解答,在这里推荐给大家。[本文章转载自这里](http://blog.csdn.net/hrn1216/article/details/51534607)1.基本概念 首先需要科普一下,最长公共子序列(longest common sequence)和最长公共子串(longes

2017-12-14 21:26:23 1343

原创 Spring的AOP实现

如果需要在Spring中使用AOP是非常简单的,只需要在Bean上加上@AspectJ,在方法上加@PointCut、@Before等注解就可以实现你想要的逻辑,最后在XML配置文件中加入即可。那么Spring是如何实现的呢?动态AOP标签我们从AopNamespaceHandler中的init()方法开始分析:1.配置文件中在遇到aspectj-autoproxy标签的时候我们会

2017-12-14 13:15:58 299

原创 Spring之容器的实现

对于经常使用spring框架的同学,对于下面的这段代码肯定不会陌生ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");(1)读取配置文件applicationContext (2)找到配置文件中定义的配置并实例化以上是Spring实现容器的基础,虽然只有短短的一行,但是里面却包含了

2017-12-13 21:28:55 198

原创 动态规划之01背包问题

最近刷leetcode时遇见了好几道动态规划,因此对如何解动态规划这类题目也稍有心得。什么是动态规划?可能大家都知道官方的具体解释,巴拉巴拉一堆解释。而在我看来,动态规划就是一种对于问题的拆分。将一个问题拆分成一个一个子问题,总问题的解决办法就依靠着这些子问题的解决而解决。好比你爬上10层楼,你需要先解决1楼到2楼,2楼到3楼。。。。。。最后9楼到10楼。状态转移方程怎么来的?问题描述: 有编号分

2017-12-07 11:41:34 225

原创 谈谈RabbitMQ

消息通信常见的web服务之间的通信机制有两种 ,同步和异步。 同步方法有RMI、Hessin、Burlap、HTTP invoker,虽然同步通信比较简单,但是存在如下问题:服务需要等待,耦合度高!而异步通信就不存在这些问题,它无需等待,web服务只要将消息发送后就可以马上继续执行;对象对象和解耦;位置独立,消息发起者只需要知道 消息服务器的位置就可以发送消息,消息接收也无需知道发起者的具体位置,

2017-12-06 20:56:24 5950 2

原创 RabbitMQ的安装与入门

RabbitMQ的安装这里暂时使用window环境,稍后补充linux下的安装。首先,因为RabbitMQ由ERLANG实现,所以首先需要安装ERLANG环境,安装好之后才是RabbitMQ的安装和配置。ERLANG环境1.先去官网下载最新的OPT。直接打开exe文件执行安装,记录下安装的目录文件路径。2.将ERLANG加入系统环境: 3.此时打开erlang表示成功。 RabbitMQ安装

2017-12-04 22:56:07 268 2

原创 Redis持久化方式AOF和RDB

一谈到数据缓存,大家的脑海里面就会跳出Redis和Memcached。对于两者的比较在这里不展开详细分析,但是两者的最大区别在于Redis可以实现数据的持久化,并且提供更多的数据结构如list、set、hash等的存储。这里主要就Redis的两种持久化方式——AOF和RDB展开讨论。1.1RDBRDB是Redis默认的持久化方式,它是通过快照方式完成的,当符合一定条件时,Redis会将内存中的数据进

2017-12-04 15:50:35 247

原创 Solr学习—入门

百度上对Solr的介绍: Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。Solr安装我将在Windows下,完成对Solr的安装,假设您已经下载了Solr并且解压完成。1.将solr部署到tomca

2017-11-29 20:33:15 161

原创 浏览器输入网址后发生了什么?

在你的浏览器中输入www.baidu.com以后,会在你的浏览器呈现百度首页,这期间发生了什么?首先我们需要知道TCP/IP的网络模型,这里我就以四层模型为例子。第一步:在浏览器中输入www.baidu.com后,应用层会使用DNS解析域名,如果本地存有对应的IP,则使用;如果没有,则会向上级DNS服务器请求帮助,直至获得IP。域名解析详细过程会在下文讲到。第二步:应用层将请求的信息装载入HTTP请

2017-11-29 11:39:50 2203

原创 个人博客Blog搭建

博客整体框架采用springmvc+spring+mybatis,并且使用了maven进行项目的管理,最后部署在阿里云上,前端页面参考了Tale和CSDN。项目简介整个项目非常简单。 总共就涉及到三个表格: Dao层的mapper文件使用逆向工程产生,免去了手写mapper.xml文件的烦恼,Service层基本上也是增删改查的业务逻辑,真个项目的JSP页面也非常简单,对于前段知识比较薄弱的

2017-11-28 15:38:49 672

原创 MySQL—事务和锁

MySQL锁和其他数据库相比,MySQL的锁机制比较假单,不同的引擎支持不同的锁机制。MyISAM和MEMORY使用表级锁,BDB使用页面锁和表级锁;InnoDB默认支持行级锁,也支持表级锁。表级锁:开销小,加锁块,不会出现死锁;锁颗粒度大,容易出现锁冲突,并发级数小。行级锁:开销大,加锁慢,会出现死锁;锁颗粒度小,不容易出现锁冲突,并发级数大。页面锁:介于表级锁和行级锁之间。MyISAM表

2017-11-02 20:22:58 208

原创 MySQL—浅谈优化

索引通过使用索引,可以大大提高SQL的性能。 数据库中索引有如下几类:B+树索引 :MyISAM和InnoDB引擎默认使用的索引,最传统的索引。底层使用了B+树结构,查询效率和树高度成正比,树的高度在数据库中就代表了I/O次数。B+树索引又可以分为聚集和非聚集索引。聚集索引:聚集索引的数据页存放的是完整的记录,B+树的叶子存放的是数据。非聚集索引:B+树的叶子存放的是记录的主键,所以使用非聚集

2017-11-02 17:20:04 197

原创 MySQL—浅谈MySQL存储引擎

和大多数数据库不同,MySQL中有一个存储引擎的概念,对于不同的存储需求可以选择最优的存储引擎。如下是MySQL种常见的几种引擎以及其特性。其中MyISAM和InnoDB是我们最最常用的两个存储引擎,下面主要将对比这两种引擎的特点,以及分析在不同的需求下如何选择合适的引擎。MyISAMMyISAM是MySQL默认的数据库引擎,它不支持事务、不支持外键,优点是访问速度比较快,因为使用表级锁所以不存在死

2017-11-02 16:05:08 224

提示
确定要删除当前文章?
取消 删除