自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

try to do

try to like it

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

转载 Spring如何解决循环依赖以及三级缓存概念

转自https://blog.csdn.net/github_38687585/article/details/82317674一、循环依赖的产生和解决的前提循环依赖的产生可能有很多种情况,例如:A的构造方法中依赖了B的实例对象,同时B的构造方法中依赖了A的实例对象A的构造方法中依赖了B的实例对象,同时B的某个field或者setter需要A的实例对象,以及反之A的某个field或者...

2019-01-23 21:28:13 7356 3

转载 Spring IOC DI

IOC(DI):java程序中的每个业务逻辑至少需要两个或以上的对象来协作完成。通常,每个对象在使用他的合作对象时,自己均要使用像new object() 这样的语法来完成合作对象的申请工作。你会发现:对象间的耦合度高了。而IOC的思想是:Spring容器来实现这些相互依赖对象的创建、协调工作。对象只需要关系业务逻辑本身就可以了。从这方面来说,对象如何得到他的协作对象的责任被反转了(IOC、DI...

2019-01-23 10:03:52 117

原创 手动实现AOP:动态代理+反射

前面在学习代理模式的时候,了解到代理模式分为动态代理和静态代理。现在我们就以代理模式为基础先实现我们自己的AOP框架,再来研究Spring的AOP的实现原理。1 静态代理先以静态代理实现,静态代理关键是在代理对象和目标对象实现共同的接口,并且代理对象持有目标对象的引用。公共接口代码:public interface IHello { /** * 业务方法 * @...

2019-01-22 17:07:30 1215

转载 Spring AOP的2种使用方式

转自https://blog.csdn.net/jeffleo/article/details/54136904一、什么时候该用AOP:假如业务模块一、二、三都需要日志记录,那么如果都在三个模块内写日志逻辑,那么会有两个问题:打破模块的封装性有很多重复代码解决重复代码问题,可以通过封装日志逻辑为一个类,然后在各个模块需要的地方通过该类来试下日志功能,但是还是不能解决影响模块封装性的...

2019-01-22 16:44:49 237

原创 27 解释器模式

1 定义给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。2 适用场景如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这一就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。3 优势可以很容易的扩展和改变文法,因为该模式使用类来表示文法规则,从而可以通过继承来改变和扩展语法。也比较容...

2019-01-22 10:23:58 96

转载 Spring AOP实现原理(基于JDK和基于CGLIB)

2 如何使用Spring AOP可以通过配置文件或者编程的方式来使用Spring AOP。★ 通过配置xml(四种方式):配置ProxyFactoryBean,显式地设置advisors, advice, target等配置AutoProxyCreator,这种方式下,还是如以前一样使用定义的bean,但是从容器中获得的其实已经是代理对象通过< aop:config>来配置...

2019-01-22 10:22:48 1182

转载 Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

转自https://blog.csdn.net/luanlouis/article/details/245891931 class文件简介及加载Java编译器编译好Java文件之后,产生.class 文件在磁盘中。这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码。JVM虚拟机读取字节码文件,取出二进制数据,加载到内存中,解析.class 文件内的信息,生成对应的 Cla...

2019-01-21 22:21:38 555

转载 Spring AOP的实现原理

参考https://www.cnblogs.com/lcngu/p/5339555.htmlhttps://blog.csdn.net/yuexianchang/article/details/77018603#t4https://blog.csdn.net/luanlouis/article/details/51095702#t41 简介前段时间写的java设计模式–代理模式,最近在看...

2019-01-21 17:38:11 258

转载 java 匿名内部类

转自http://www.cnblogs.com/chenssy/p/3390871.html在这篇博客中你可以了解到匿名内部类的使用、匿名内部类要注意的事项、如何初始化匿名内部类、匿名内部类使用的形参为何要为final。1 使用匿名内部类内部类匿名内部类由于没有名字,所以它的创建方式有点儿奇怪。创建格式如下:new 父类构造器(参数列表)|实现接口() { /...

2019-01-18 17:43:26 68

原创 28 访问者模式

1 定义表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的前提下定义作用于这些元素的新操作。2 适用场景适用于数据结构相对稳定,又有易于变化的算法的系统(就是element稳定,visitor经常变化)3 优势由于把数据结构和数据结构上的操作进行了解耦,也就是把处理从数据结构中分离出来,使得增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。4 缺点源于...

2019-01-18 12:28:52 122

原创 java Socket多线程聊天程序

以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工...

2019-01-17 19:47:48 635

原创 LeetCode 460. LFU Cache

题目:460. LFU Cache设计并实现最不经常使用(LFU)缓存的数据结构。它应该支持以下操作:get 和 put。get(key) - 如果键存在于缓存中,则获取键的值(总是正数),否则返回 -1。put(key, value) - 如果键不存在,请设置或插入值。当缓存达到其容量时,它应该在插入新项目之前,使最不经常使用的项目无效。在此问题中,当存在平局(即两个或更多个键具有相同...

2019-01-17 17:00:01 467

原创 LeetCode 146. LRU cache

1 什么是Cache1.1 概念Cache,即高速缓存,是介于CPU和内存之间的高速小容量存储器。在金字塔式存储体系中它位于自顶向下的第二层,仅次于CPU寄存器。其容量远小于内存,但速度却可以接近CPU的频率。当CPU发出内存访问请求时,会先查看 Cache 内是否有请求数据。如果存在(命中),则直接返回该数据;如果不存在(失效),再去访问内存 —— 先把内存中的相应数据载入缓存,再将其返回...

2019-01-17 15:31:41 170

原创 B树和B+树的区别

1 B树每个节点都存储key和data,所有节点组成这棵树,并且叶子节点指针为null。2 B+树只有叶子节点存储data,叶子节点包含了这棵树的所有键值,叶子节点不存储指针。后来,在B+树上增加了顺序访问指针,也就是每个叶子节点增加一个指向相邻叶子节点的指针,这样B+树成了数据库系统实现索引的首选数据结构。原因有很多,最主要的是这棵树矮胖。一般来说,索引很大,往往以索引文件的形式存......

2019-01-16 21:01:47 469

原创 java Integer与int的装箱(缓存)与拆箱

装箱与拆箱的含义:JAVA中的自动装箱指的是把基本类型的值转换为对应的包装类对象,自动拆箱则相反。如下代码所示: Integer i1=100; int i2=i1;分析如下:Integer i1=100实现了自动装箱,底层调用了调用包装类的valueOf方法,也就是Integer.valueOf(100)。int i2=i1实现了自动拆箱,底层调用包装类的intValue...

2019-01-15 15:27:04 511

原创 LeetCode 4. 寻找两个有序数组的中位数

题目:寻找两个有序数组的中位数给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。示例 1:nums1 = [1, 3]nums2 = [2]则中位数是 2.0示例 2:nums1 = [1, 2]nums2 ...

2019-01-14 22:04:23 96

原创 26 享元模式

1 定义享元模式就是:运用共享技术有效地支持大量细粒度的对象。2 内部状态与外部状态内部状态:在享元对象内部并且不会随环境改变而改变的共享部分。外部状态:随环境改变而改变的、不可以共享的状态。享元模式Flyweight执行时所需的状态有内部的也有外部的,内部状态存储于ConcreteFlyweight对象中,外部状态则应该考虑有客户端对象存储或计算,当调用Flyweight对象的操作...

2019-01-14 15:52:43 82

原创 25 中介者模式(调停者模式)

1 定义用一个对象来封装一系列的对象交互。中介者使各对象不需要显示的互相引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。2 优点中介者的出现降低了各个交互对象之间的耦合性,使得可以独立和复用所有的交互对象类、中介者类。由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到了它们之间的交互上来,也就是站在一个更宏观...

2019-01-14 11:50:53 206

原创 24 职责链模式

1 定义使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。从定义分析:对于一个请求会有多个对象对其进行转发。请求的发送者和最终处理请求的接受者之间互相并不知道,没有任何耦合关系。最终能够处理一个请求的对象有且只有一个,如果没有则表示处理过程or职责链设置出现错误。2 优势客户提交一个请求...

2019-01-14 11:10:05 147

原创 LeetCode 43. 字符串相乘

题目:43. 字符串相乘给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。示例 1:输入: num1 = “2”, num2 = “3”输出: “6”示例 2:输入: num1 = “123”, num2 = “456”输出: “56088”说明:num1 和 num2 的长度小于110...

2019-01-11 12:08:14 89

原创 23 命令模式

1 定义将一个请求封装为一个对象,从而可以使用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销操作。2 优势能较容易的设计一个命令队列。在需要的情况下,可以较容易的将命令记入日志。允许接受请求的一方决定是否要否决请求。可以容易的实现对请求的撤销和重做。由于加进具体命令类不影响其他的类,因此增加新的具体命令操作很容易。最重要一点就是:命令模式把请求一个操作的对象...

2019-01-10 22:32:39 166

原创 22 桥接模式

1 定义将抽象部分和它的实现部分分离,使它们都可以独立的变化。也就是说:实现系统可能会有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让他们独立变化,减少它们之间的耦合。2 组合/聚合复用原则2.1 组合和聚合的定义组合(合成):强拥有关系,比如大雁和翅膀的关系,大雁拥有2只翅膀,翅膀是大雁的一部分,2者的声明周期是一样的。聚合:弱拥有关系,比如雁群和大雁的关系,雁群由...

2019-01-10 20:53:33 198

原创 21 单例模式

1 定义单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。2 UML# 3 优点严格控制客户端如何访问和何时访问它,即对唯一实例的受控访问。4 单例类和实用类的区别相同:实用类也采用私有的构造方法避免其实例化。不同:实用类不保存状态,仅提供静态方法或者静态属性给用户使用;而单例类是有状态的。实用类不能用于继承多态;单例类可以有子类继承。实用类只是一些方法和属............

2019-01-10 18:42:21 284

原创 LeetCode 41. 缺失的第一个正数

题目:41. 缺失的第一个正数给定一个未排序的整数数组,找出其中没有出现的最小的正整数。示例 1:输入: [1,2,0]输出: 3示例 2:输入: [3,4,-1,1]输出: 2示例 3:输入: [7,8,9,11,12]输出: 1说明:你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。思路:把数组变成“理想情况”的状态,即{1,2,3,4,5,…},然后...

2019-01-10 17:10:43 184

原创 LeetCode 216. 组合总和 III(回溯法)

题目:216. 组合总和 III找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。说明:所有数字都是正整数。解集不能包含重复的组合。示例 1:输入: k = 3, n = 7输出: [[1,2,4]]示例 2:输入: k = 3, n = 9输出: [[1,2,6], [1,3,5], [2,3,...

2019-01-10 15:52:23 361

原创 LeetCode 40. 组合总和 II(回溯法)

题目:40. 组合总和 II给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。说明:所有数字(包括目标数)都是正整数。解集不能包含重复的组合。示例 1:输入: candidates = [10,1,2,7,6,1,5], ta...

2019-01-10 12:16:15 170

原创 LeetCode 39. 组合总和(回溯法)

题目:39. 组合总和给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。示例 1:输入: candidates = [2,3,6,7], target...

2019-01-10 12:04:19 474

原创 LeetCode 38. 报数

题目:38. 报数(简单题)报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:111211211111221解释题意:第一个:初始化为“1”第二个:上一个的“1”用规则表示出来就是“1个1”,即“11”。第三个:上一个的“11”用规则表示出来就是“2个1”,即“21”。第四个:上一个的“21”用规则表示出来就是“1个2,1个1”,即“1...

2019-01-10 11:18:52 141

原创 LeetCode 37. 解数独

题目:37. 解数独编写一个程序,通过已填充的空格来解决数独问题。一个数独的解法需遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。空白格用 ‘.’ 表示。一个数独。答案被标成红色。Note:给定的数独序列只包含数字 1-9 和字符 ‘.’ 。你可以假设给定的数...

2019-01-10 10:43:12 265

原创 LeetCode 36. 有效的数独

题目:36. 有效的数独判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。上图是一个部分填充的有效的数独。数独部分空格内已填入了数字,空白格用 ‘.’ 表示。示例 1:输入:[[“5”,“3”,"."...

2019-01-09 23:10:35 98

原创 LeetCode 35. 搜索插入位置

题目:35. 搜索插入位置给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例 1:输入: [1,3,5,6], 5输出: 2示例 2:输入: [1,3,5,6], 2输出: 1示例 3:输入: [1,3,5,6], 7输出: 4示例 4:输入: [1,...

2019-01-09 22:07:29 96

原创 LeetCode 34.在排序数组中查找元素的第一个和最后一个位置

题目:34.在排序数组中查找元素的第一个和最后一个位置给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: [3,4]示例 ...

2019-01-09 21:54:17 649 3

原创 20 迭代器模式

看书:11:35–12:00写博客:12:00–1 定义和使用场景定义:提供一种方法顺序访问一个对象中各个元素,而又不暴露对象的内部表示。使用场景:当需要对聚集有多种方式遍历时,可以用迭代器模式。2 优点迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,带来的优点:不暴露集合的内部结构让外部代码透明地访问集合内部的数据2 实际应用由于现在高级语言,比如j...

2019-01-09 15:05:34 134

原创 19 组合模式(Composite Pattern)

1 定义将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的适用具有一致性,即整体和部分可以被一致对待。2 透明方式和安全方式两者各有好处,视情况而定选哪种。透明方式:Compoment抽象类中声明了用来管理子类的方法,包括add(), remove()等,这样继承了该抽象类的类都具有add(), remove()方法。好处:叶节点和枝节点对于外界没...

2019-01-09 11:32:11 237

原创 18 备忘录模式

1 定义在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。2 适用场景Memento模式适用于功能比较复杂的,需要维护或记录属性历史的类 or 需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到前一状态。有时一些对象的内部信息必须保存在对象外的地方,但是必须由对象自己读取...

2019-01-09 10:07:20 119 2

原创 LeetCode 32. 最长有效括号

题目:最长有效括号给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。示例 1:输入: “(()”输出: 2解释: 最长有效括号子串为 “()”示例 2:输入: “)()())”输出: 4解释: 最长有效括号子串为 “()()”思路:利用stack,stack中记录(的位置,遇到)时,判断是否有效,详细见注解public int longes...

2019-01-08 23:02:28 225

原创 LeetCode 30. 与所有单词相关联的字串

题目:与所有单词相关联的字串描述:给定一个字符串 s 和一些长度相同的单词 words。在 s 中找出可以恰好串联 words 中所有单词的子串的起始位置。注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。示例 1:输入:s = “barfoothefoobarman”,words = [“foo”,“bar”]输...

2019-01-08 22:03:45 149

原创 17 适配器模式

1 定义和作用定义:将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。作用:开发中,系统的数据和行为都正确,但接口不符时,使用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。2 使用场景和优点使用场景:使用一个已经存在的类,但它的接口,也就是它的方法和你的要求不相同时,就应该考虑适配器模式。通常在软件开发的...

2019-01-08 17:12:53 112

原创 16 状态模式

1 定义当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。2 解决的问题状态模式主要用于解决:当控制一个对象状态转换的表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的逻辑简化。3 优势将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。4 使用场景当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为...

2019-01-08 15:42:15 264

原创 15 抽象工厂模式

1 工厂模式和抽象工厂模式的区别工厂模式适合具体功能类ConcreteProductX只有一个系列的情况;抽象工厂模式适合一个具体功能类ConcreteProductX有至少两个系列的情况。2 抽象工厂模式准确定义提供一个创建一系列相关或相互依赖的接口,而无需指定它们具体的类。3 抽象工厂模式的优点和缺点3.1优点易于交换产品系列,这是最大的优点。例如IFactory factory...

2019-01-08 11:41:34 134

空空如也

空空如也

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

TA关注的人

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