自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小萤哥的博客

小码农要准备开挂啦

  • 博客(43)
  • 收藏
  • 关注

原创 Spring源码学习之旅 IOC扩展能力

扩展–一切皆有可能其实从spring角度来说,最强大的能力是它无与伦比的扩展能力,从简单的启动代码里看一看它的扩展能力的强大之处. public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Person test = context.getBean("test", Pe

2020-12-19 15:58:13 146 1

原创 小工具 -- Validate注解全集

我是谁?我是搬运工,内容来自Hibernate Validator官网,翻译如有问题,自行查阅官方文档Version: Hibernate Validator 6.0.15Source: https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/一、Bean Validation constraints(Bean校验,JSR 380标准)@AssertFalse描述:检查注解元素是否为fal

2020-12-08 15:03:06 1309

原创 算法与数据结构-算法篇-堆排序

堆排序快有一个月没有写博客了,还是得把这些东西好好梳理一下,今天写下堆排序的相关内容堆排序和快速排序相比,可能相对会复杂一些,不那么容易理解先给出结论,堆排序和快速排序一样,平均的时间复杂度都是o(N * logN),但是常数项的大小一般要大过快速排序,因此快速排序的速度通常比堆排序更快一 堆结构在开始了解堆排序前,首先需要知道的是,这种算法是基于堆的数据结构设计而来的一种排序算法so,啥是堆咧?堆是一种具备特殊性质的完全二叉树! 那啥又是二叉树,啥又是完全二叉树??1.二叉树二

2020-07-18 17:18:02 193

原创 算法与数据结构-算法篇-快速排序

快速排序Java里的Arrays有一个sort()方法,具体的排序细节就是使用快速排序进行的实现,它是一个不稳定的,追求排序速度的排序算法 ,时间复杂度O(N* logN)它与归并的思路有相近之处,都是先保证局部有序,再保证整体有序在引入快速排序前,需要先去引导出两个问题一、如何在一个无序数组里指定一个数K,保证左侧所有数都小于等于K,右侧数都大于K例1,数组[2,1,3,4,5,1,3],k=3,返回 [2,1,1,3,3,4,5]即可例2,数组[2,1,4,2,4,5,3,6],k=6

2020-06-16 17:13:21 221

原创 Redis学习之旅 底层数组结构

Redis学习之旅 底层数组结构有人会问,redis的数据结构不是string list set hash zset么?怎么又出来一个底层数据结构?Redis自行构建了自己的VM,设计了五种底层的数据结构来实现上层的五种对外的数据结构本质上,一切设计都是为了保证redis在执行命令时的快,从这个角度出发去理解Redis的底层数据结构会更容易一些SDS(Simple Dynamic String)先考虑个问题,如果在内存中直接使用字符数组(类似java)来保存上层String类型的数据,那么做

2020-06-04 17:14:06 183

原创 算法与数据结构-算法篇-归并排序

归并排序归并排序,主体思想还是分而治之,将一整块完整的内容拆成几个小块来实现,最后将结果汇总成一个大的结果,就实现了需要的效果归并的玩法就是先拆,拆完保证左边也有序,右边也有序,再想怎么把两个有序数组合并所以归并的问题可以总结为两个问题,一是怎么拆,二是怎么合怎么拆?对于排序来讲,如果只有两个元素,拆为左右各一个元素,那么左右两组的顺序就特别好比较我们将任务拆到一个元素的级别,就能保证左边也有序,右边也有序(废话,自己和自己比,当然有序)怎么合?其实归并算法的难就难在理解合并上,合

2020-06-02 23:24:11 164

原创 算法与数据结构-算法篇-插入排序

算法与数据结构-算法篇-插入排序插入排序的思路是在数组内维护出一个有序数组,每次将取到的数按位置进行插入,得到一个排序好的数组这种排序属于不稳定的排序,排序的性能可能会随意数组的结构而产生较大的差异每一次排完序后,都要保证当前索引前面的所有数已经是一个有序数组即可实现方式就是在数组的遍历过程中,索引每偏移一次,都将新的元素向前查找,找到对应的位置放进去,后面的元素后移算法实现步骤开始开始时,索引指向0号位,然后向前看,越界了,比较停止第二步索引后移一步指向了2,2向前比较,发现

2020-06-02 22:42:11 173

原创 Redis学习之旅 管道/脚本/过期/事务

Redis学习之旅 管道/脚本/过期/事务本文尝试将 管道、脚本、过期和事务一起归纳一下管道我们都知道,一个命令通常都是由一个客户端通过网络连接发送到某个服务,由服务做出响应并给出回复,相对于Redis的快速,网络的传输速度往往是制约Redis发挥最大功效的因素,因此Redis设计了管道的概念常规的使用,就是由客户端 1.通过网络发送请求-2.Redis处理计算-3.通过网络返回结果,所有的命令都是这样123-123-123式的进行处理,性能的消耗基本上都消耗在了网络传输上,在此基础

2020-06-02 11:12:21 172

原创 Redis学习之旅 ZSet(Sorted set)篇

Redis学习之旅 ZSet(Sorted set)篇为啥它叫ZSet?因为Set的开头字母也是S,Sorted Set缩写为SSet不合适 ,会导致命令冲突 ,所以干脆用Z代替,ZSet出生了~它的出现也是解决set天生无序的问题命令学习redis-cli模式下键入 help @sorted_set就可以快速相关的命令集合1.0 时代命令起始版本作用示例ZADD1.2.0添加元素ZADD key [NXZCARD1.2.0和SCARD很类似,统计

2020-06-01 22:12:13 632

原创 Redis学习之旅 Set篇

Redis学习之旅 Set篇set和list一样都是一个存储容器,但是它的list有两个不同的地方一是无序二是元素会自动去重命令学习redis-cli模式下键入 help @set 就可以快速相关的命令集合1.0时代/2.0时代set也是一个不经常变更的命令集,在1.0时代添加了大量的set命令之后 ,2.0版本增加过一个命令后就再也没有维护过,此处进行合并项目Value作用示例SADD1.0.0向set里添加元素SADD key member [m

2020-06-01 20:15:06 125

原创 Redis学习之旅 Hash篇

Redis学习之旅 Hash篇Hash结构就是在redis本身 的K-V结构基本上,又提供了一个K-V结构,通常用来保存对象结构比较合适,但是不宜将对象结构弄的过大命令学习redis-cli模式下键入 help @hash就可以快速相关的命令集合hash是从2.0开始加入到redis中的,因此从2.0开始总结2.0时代/3.0时代hash命令自2.0加入后,在3.2版本新增了一个命令后,就没再更新过,因此合并汇总命令起始版本作用示例HDEL2.0.0删除

2020-06-01 17:36:42 114

原创 Redis学习之旅 List篇

Redis学习之旅 List篇List可以组装成队列、栈等容器,还可以拿来实现消息队列有几个前提要知道,list内的元素是可重复的,每一个元素其实还是一个String类型的对象命令学习redis-cli模式下键入 help @list 就可以快速相关的命令集合在学习Redis命令时,有些东西需要知道,L开头的命令,有些是指的Left ,有些指的是List1.0时代命令起始版本作用示例LINDEX1.0.0list index 从左侧0起,按索引查找对应位置的

2020-06-01 17:15:04 185

原创 Java容器篇 HashMap

1

2020-06-01 15:59:49 160

原创 Redis学习之旅 位图(BitMap)

Redis学习之旅 位图(BitMap)单独给位图开一章,是因为这块的东西确实玩法众多,面试也常常遇到,干脆将其拆分为独立的一章Redis BIT相关命令BITCOUNT从字面意思上来看,bitcount翻译过来叫位统计,那么统计的是什么呢?,其实是01串中1的个数OK,这不简单么,我知道了,字符串1 BITCOUNT的结果肯定是1,因为1的二进制是 0000 0001嘛,我们看下结果我了个大擦,怎么会是3?,这就又回到我们在String篇里提到的一个概念,Redis Strin

2020-05-28 13:06:10 331

原创 Redis学习之旅 String篇

Redis学习之旅 String篇String 支持追加,截取,自增,位图等等玩法,大佬们都快把Redis的String玩出花了,本篇总结下Redis 的String 类型认识type/ object encoding命令先看下type命令的帮助文档,它说这个命令可以确定一个已存储的Key的类型可以看到无论输入什么样的数据,字符串也好,数字串也好,他显示的type都是string但是通过对象编码命令查看,就会看到,Redis在类型之外 ,还单独的维护了一个编码格式进行编码的好处在于,可

2020-05-28 00:34:17 156

原创 Redis学习之旅 安装Redis6.0.3

Redis学习之旅 安装Redis6.0.3一切,从安装开始友情链接,Redis 英文官方网站下载编译可以通过这个链接下载并安装Redis 6.0.3版本,安装的主机版本CentOS 7wget http://download.redis.io/releases/redis-6.0.3.tar.gz解压文件tar zxf redis-6.0.3cd redis-6.0.3可以看到一个README.MD的MarkDown文档,打开它,文档中清晰的记录了如何去构建RedisOK,是

2020-05-27 22:30:27 317

原创 Spring源码学习之旅 初识IOC

初识IOC作为Spring最最重要与核心的功能,我们需要先去了解Spring IOC是个什么东东,经过五个大版本的发展, Spring容器已经由早期的纯XML配置转为0XML配置,但是从XML来开始了解Spring IOC会让人更加的理解它的发展历程,那就从XML开始吧什么是IOCIOC,即 Inversion of Control,中文译名-控制反转,那么问题就来了,控制反转,反转的是什么控制?又是如何反转的?其实Spring最早的时候只干了一件事,就是将实例化的过程帮助程序员实现了,原本一

2020-05-25 16:41:07 235

原创 Spring源码学习之旅 先搞定环境再说!

下载Spring源码,编译源码前提请先确保已经安装过JDK,Gradle,Git如果不会,自行百度,这个太过基础了如何下载源码1.Spring官方github地址OK,如果你的网比较好,或者有比较好的梯子,那么可以方便的从github上同步spring官方的代码到本地。你只需要执行一下 git clone git@github.com:spring-projects/spring-framework.git 即可SpringFramework官方仓库地址2.gitee 转 gith

2020-05-23 01:16:05 458

原创 Spring源码学习之旅

Spring Framework学习Spring框架对于java程序员的意义非常特殊,不会Spring的java程序员基本上可以认为就是不会java,因此掌握Spring框架显得尤为重要Spring框架提供了两样重要的功能 – IOC AOPIOC(Inversion of Control)IOC的直译便是控制反转,既然有一个反转,那么就必然有一个与之对立的使用方式,即正向使用,那么什么是正向使用?Object o = new Object();这就是一段正向使用,很多人认为,这不是很正常

2020-05-19 00:55:42 129

原创 算法与数据结构-算法篇-选择排序

选择排序既然名为选择,那么排序过程一定不是全部进行排序,而是对选择出来的某项进行了排序1.先将0~N进行遍历,找到最小数的索引,然后将其与0号位交换2.再遍历1~N位置,找到次小数的索引,将其与1号位交换3.遍历2~N位置,找到第三小的数的索引,将其与2号位交换,依次类推图示第一轮比较先将0~4号位的所有数查一下,发现3号位置数最小,将3号位与0号位交换最小值索引号交换结果31 5 2 9 4第二轮比较最小值1已经到了0号位,接下来只看1~4号位,最

2020-05-19 00:39:01 101

原创 Java设计模式全集-备忘录模式(Memento)

备忘录模式(Memento)所谓的备忘录,顾名思义,可以用来备份的东西,比如游戏的存档,数据库的快照等等,就是对某一项内容进行数据备份,在必要时可以通过这个备份进行数据的恢复或者回退,将数据恢复或者回退到备份前的状态简单来说,以前有些游戏,需要到存盘点才可以存盘,这时候你没有存盘,跑去打BOSS,结果又没打赢,死了。这时候读取的存档,就是一份备忘录Java的序列化接口要实现java的默认序列化与反序列化,则必须实现Serializable接口,建议添加serialVersionUID,且生

2020-05-19 00:11:46 217

原创 算法与数据结构-算法篇-冒泡排序

冒泡排序冒泡排序算是比较符合大家直观想象内的一种比较排序方法,也是容易实现的比较算法之一思路,有0~N个无规则排列的数,需要进行排序,那么一、从0循环到

2020-05-15 22:27:38 240

原创 Java设计模式全集-状态模式(State)

状态模式(State)状态模式也是一种行为型设计模式,它可以将一些相互间无关联的内容进行解耦,对于平时写出的一大堆的if else有优化作用,和策略模式有点相近,都是对不同的代码分支进行去耦合,但是不同的在于策略模式更加注重一套完整的策略解决方案,并不太关心原来入口处的逻辑,但是相对于策略模式来说,状态模式里有了一个Context的概念,状态的解耦合对象其实是一个固定的Context,其中不同的状态可能还会关心上下文中的一些方法结果打个比方,策略模式就好比,我去登录某个网站,网站给我的密码进行加密,用

2020-05-15 21:31:44 375

原创 Java设计模式全集-命令模式(Command)

命令模式(Command)命令模式的核心思想是将命令的发送者与命令的执行者进行了解耦,方便对二者进行扩展其中有几个比较重点的角色1.Command 即命令的接口或者抽象,所有的命令由其扩展2.Receiver 命令的接收者,执行者,它负责对由Command扩展出来的命令做出具体的执行操作3.ConcreteCommand 译成中文为–具体命令,由Command扩展而来,定义某个具体的命令,内部持有一个recevier对象,将Command和Receiver连接起来,起到一个桥梁作用,将具体的

2020-05-12 19:05:11 239

原创 Java设计模式全集-桥接模式(Bridge)

桥接模式(Bridge)将抽象部分与具体实现分开,通过聚合的方式代替继承,防止因为类不断继承产生类爆炸比如手机有很多品牌,手机还可以安装游戏,游戏又有不同的开发厂商,将游戏进行抽象,聚合到手机类中,可以通过安装游戏的方法,将不同的游戏对象装入手机对象中,获得不同的对象结果整体上与抽象工厂非常相似,但侧重点不同,抽象工厂侧重于对于一组产品的集中式扩展,而桥接模式是为了防止类的继承爆炸,是为了...

2020-05-06 23:55:59 512

原创 Java设计模式全集-模板方法(Template Method)

模板方法(Template Method)比较常用的设计模式,对于一套固定的流程式的代码,在抽象类中定义流程运转的骨架,由子类来实现具体的细节典型的像spring 的AbstractApplicationContext的refresh方法 Re...

2020-05-06 22:06:49 127

原创 Java设计模式全集-适配器模式(Adapter)

适配器模式(Adapter)运用于在现有几套不同的组件,互相间的接口定义不一致,又期望让他们可以协同工作,可以通过实现一套适配器,让本身无法兼容的组件可以协同工作了mybatis中兼容了很多日志组件,不同的日志组件中又定义了不同的日志级别,因此mybatis定义了一套标准的日志级别,然后针对不同的日志组件,开发一套不同的适配器,让兼容的日志组件得以对应到mybatis的日志级别上举个例子,...

2020-05-06 21:36:18 176

原创 Java设计模式全集-原型模式(prototype)

原型模式(prototype)又是一种用法比较局限的设计模式,最典型的场景即为java的Cloneable接口,核心思想为提供一个快速创建重复对象的方式可以快速的通过拷贝方式对现有对象完成快速复制需要注意浅拷贝与深拷贝的问题demo基础数据类型测试/** * @author Xiaoyingge * @description * @date 2020/5/6 21:06...

2020-05-06 21:24:44 116

原创 Java设计模式全集-访问者模式(Visitor)

访问者模式(Visitor)从设计原则上来说,它破了对象的封装性,因为访问者模式将被访问对象的相关属性暴露出来并可以操纵它们,即将对象的定义与它的操作进行了拆分它适用于类的结构相对固定,但是类属性的操作经常发生变化的场景如果某个类的属性结构时常发生变化 ,那第它一定不适用于访问者模式UML具体角色分工Visitor:定义为接口或者抽象类,封装了访问所有属性的方法的接口,也是因此...

2020-04-26 22:34:17 157

原创 Java设计模式全集-迭代器模式(Iterator)

迭代器模式(Iterator)迭代器模式用的比较多,像List.iterator()就是使用的迭代器模式,迭代器模式通常用于对于自已定义的容器设计一套遍历方案。因为自己创建实现的容器,只有自己才清楚它的内存存储模型,因此也只有自己清楚对它的数据要进行如何遍历。比如对于树结构,就有中序遍历,前序遍历,后序遍历,因此,通过统一的迭代器接口,即可实现对同一接口抽象的统一遍历要求的封装定义一个迭...

2020-04-26 21:53:31 154

原创 Java设计模式全集-建造者模式(Builder)

建造者模式(Builder)对于一些属性较多的类,或者构造过程较复杂的类,通过建造者模式可以灵活定义哪些属性需要配置,哪些属性无需配置,同时屏蔽内部的创建逻辑。通常的做法都是在内部添加一个内部类,通过内部类的方法添加各个属性并返回建造器自己的方式实现链式调用,最后可以在build()方法中实现复杂计算并返回构造好的对象它和工厂模式的区别在于工厂模式并不关心产品的生产过程,只管找工厂要产品,...

2020-04-26 21:36:59 119

原创 Java设计模式全集-代理模式(Proxy)

代理模式(Proxy)代理模式在Java开发中也算经常使用的,如Spring AOP ,Mybatis Mapper代理生活中代理模式也非常常见,比如某某食品厂生产了一种新口味巧克力,那自己如何将它从工厂分销到消费者手里呢,让消费者来自己的工厂购买无疑是不合适的,于是乎,某某巧克力全国总代理、全省总代理、全市总代理就出现了,消费者只需要在自己需要的时候,就方便的可以获取到它代理模式使用场...

2020-04-25 17:15:41 223

原创 Java设计模式全集-观察者模式(Observer)

观察者模式(Observer)观察者模式的运用场景非常多,事件的监听器Listener,钩子函数Hook,回调函数Callback本质上都是一种观察者模式的实现观察者模式的实现特点1.事件源对象,其中注册了一组或者多组监听器2.事件对象,发生指定事件后,事件源生成具体的事件交给负责处理此类事件的监听器们3.监听者对象,负责对已经发生的事件进行处理简单理解在见面上点击一个button,...

2020-04-25 12:59:13 190

原创 Java设计模式全集-享元模式(FlyWeight)

享元模式(FlyWeight)享元模式更多的应该算是一种思想,即对可复用资源的重复利用,例如java的字符串常量池,数据库连接池,线程池等等相关的池化技术都可以算是对享元设计模式的一种运用demo/** * java字符串常量池的判断 * * @author xiaoyingge * @description * @date 2020/4/25 12:29 */publi...

2020-04-25 12:33:53 126

原创 Java设计模式全集-组合模式(Composite)

组合模式(Composite)使用场景比较在限,最主要的作用在于描述树形结构不是特别重要,不做太多篇幅UMLdemo抽象父类/** * @author xiaoyingge * @description * @date 2020/4/25 11:54 */public abstract class AbstractTreeNode { protected ...

2020-04-25 12:23:53 115

原创 Java设计模式全集-装饰器模式(Decorator)

装饰器模式(Decorator)对一个类进行不断的装饰,不断的去丰富类的功能,又保证不改动原来的类,即在原来类的基础上,动态的扩展新的功能,这个点听起来与代理模式非常像,但代理模式更加侧重于对类增强部分的处理,即这个类被我代理后,我应该怎样去增强它?装饰器模式则是我有一组已经实现好的增强,这次需要给这个类增加哪一个或者哪几个增强呢?举个栗子Tony Stark在山洞中打造出了Mark ...

2020-04-24 01:58:12 146

原创 Java设计模式全集-责任链模式(Chain of Responsibility)

责任链模式(Chain of Responsibility)即将一组处理器通过串行化的方式组装在一起,共同来处理同一个对象,这个对象具体会在哪一个处理器中进行处理是未知的,可以方便的对不同的需求组织不同的处理器实现高度自由化的定制处理策略UML从类图上看和策略模式很像,但与策略不同的地方在于,责任链将所有的实现自由的组装到一个链条中,可以是一个遍历的处理器数组,可以是由给每个处理器指...

2020-04-24 00:55:52 297

原创 Java设计模式全集-调停者/中介者模式(Mediator)

调停者模式(Mediator)调停者模式解决多个对象间互相引用,相互出现大量的耦合的场景,通过引入中间的调停者,将所有的调用方进行解耦合可以将各个类间的相互耦合调整为每一个对象与调停者之间的耦合,调用者只需要向调停者发起请求或者响应调停者的调用即可,减轻了维护工作量简单的场景就是 一个公司有多个部门,设计部门需要将设计文档交付给开发部门与测试部门,开发部门需要生产功能并交付测试,测试需...

2020-04-23 19:32:52 201

原创 Java设计模式全集-门面/外观模式(Facade)

门面/外观模式(Facade)门面模式,也叫作外观模式,通常来说是为了解除对外调用的复杂性时进行运用,主要的思想是保证内部逻辑对外部调用者的透明,像mybatis对外提供服务,基本上都是由SqlSession统一提供服务,至于一级缓存,二级缓存如果实现,不需要外部开发者进行关心UML可能直接从UML图上看不出来什么,那么举一个现实中的例子,像现在很多地方都建立了行政服务大厅,各个政府...

2020-04-23 13:16:29 109

原创 Java设计模式全集-工厂模式系列(Factories)

工厂模式系列(Factories)之所以用factories是因为工厂模式有好几种实现,工厂模式的运用主要的核心在于将一组通用的抽象对象交由工厂去进行具体的实现,屏蔽加工的细节比如说,我需要一台电脑,那我就去找电脑生产商去买,如果我想买苹果电脑,那么找苹果电脑生产工厂,如果我想买美帝良心想,那么找美帝良心工厂即可1.简单工厂简单工厂即在工厂类内部生产指定的产品,对于逻辑基本不变的场景...

2020-04-21 21:55:03 334

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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