- 博客(53)
- 收藏
- 关注
原创 责任链模式
责任链模式责任链模式将请求在一个对象处理器链上传递,直到某个对象处理这个请求成功为止。该模式简化了请求的处理,每个对象处理器仅负责自己的单一职责,因此责任链模式也称为职责链模式。UML类图其中Handler是一个抽象类,它有一个successor字段,该字段指向职责链下一个处理器,方法handlerRequest处理请求。看下代码实现代码实现Handler类 package com.lms...
2018-04-22 13:25:11 383
原创 IdentityHashMap源码详解
IdentityHashMap是一致性哈希表,使用引用相等,而不是equals方法来比较两个对象的相等性。因此,IdentityHashMap中,如果存在两个键key1和key2,当且仅当key1==key2时,两个键相等。
2017-11-20 22:33:11 1431
原创 享元模式
享元模式的核心思想其实就是共享,节省内存,减少开销,例如项目中的对象共享,利用享元工厂维护已经创建的或者预先创建的对象,当需要时再去该工厂里拿即可。
2017-11-12 23:22:55 488
原创 ConcurrentHashMap源码详解
ConcurrentHashMap是线程安全的哈希表,不同于HashTable,后者在方法上增加synchronized关键字,利用对象同步锁实现线程之间的同步。显然,HashTable实现线程安全的方式太“重”,并发度高的情况下,很多线程争用同一把锁,吞吐量较低。ConcurrentHashMap通过锁分段技术,只有在同一个段内,才会存在锁竞争,提高了并发度。
2017-10-12 20:35:27 1818 1
原创 ForkJoin框架(二):ForkJoinTask
ForkJoinTask将任务fork成足够小的任务,并发解决这些小任务,然后将这些小任务结果join。这种思想充分利用了CPU的多核系统,使得CPU的利用率得到大幅度提升,减少了任务执行时间。
2017-10-08 10:03:29 7757
原创 CopyOnWriteArrayList源码详解
CopyOnWriteArrayList是线程安全集合,它内部通过一个数组存储元素。通过名字可以看出,这是一个“写时复制”的List,每次要修改该List的时候,都会new一个新的数组,copy原来数组元素到该新的数组,并在该新的数组上修改,修改完后,更新原有数组引用到该新的数组。
2017-09-26 20:47:38 517
原创 LinkedList源码详解
链表是我们接触最多的数组结构之一,Java的LinkedList实现了链表这一数据结构,并且实现的是双向链表,LinkedList还提供了双端队列的操作。LinkedList可以存储任何元素,包括null。和ArrayList不同的是,LinkedList是一个”顺序存取“的List,而ArrayList是一个”随机存取“的List。
2017-09-23 16:32:32 518
原创 ArrayList源码解析
ArrayList用数组作为内部元素的存储,该数组的大小就是ArrayList的容量,它内部还维护了一个变量size保存当前元素的个数。
2017-09-21 22:19:33 462
原创 冒泡排序
冒泡排序遍历待排序的数组,比较相邻两个元素的大小,如果顺序错误就将这两个相邻元素交换。每次外循环都将较大的元素往后移,类似气泡上浮过程变得越来越大,取名为冒泡排序。
2017-09-17 14:02:57 485
原创 组合模式
组合模式(Composite),将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性,用户不用关心自己处理的是叶子节点还是组合节点。
2017-09-17 09:22:40 676
原创 ForkJoin框架(一):ForkJoin框架概述
JAVA 1.7引入了ForkJoin框架,该框架由Java大神Doug Lea所写,它是一个并发执行任务的框架。
2017-09-12 21:54:14 1903
原创 简单选择排序
简单选择排序的思路很简单,首先,找到数组中最小的元素,将它和数组中的第一个元素交换,其次在剩下的元素中找到最小的元素,将它与数组中的第二个元素交换,如此往复,直到将整个数组排序。
2017-09-10 20:28:52 770
原创 线程池原理(六):Executors
Executors是线程池的工厂类,可以创建ExecutorService、ScheduledExecutorService、ThreadFactory、Callable的实例。
2017-09-09 15:48:20 1219
原创 线程池原理(五):CompletionService
任务提交到线程池后,将任务的Future放到一个List中,然后遍历List,通过Future的get方法得到返回值。如果在遍历过程中get方法阻塞,即使位于List后面的Future已经完成,遍历List的线程也要继续等待,这就对效率有比较大的影响。我们希望任务结束后,返回值能够立即被获取,而不是要等待其他任务结束,CompletionService正是为此而生。
2017-09-05 22:50:34 1056
原创 快速排序
快速排序的基本思想是通过划分子数组实现的,对于数组A[p…r],划分子数组后得到一个索引q,使得A[p…q-1]子数组的值都小于A[q],A[q+1…r]子数组的值都大于等于A[q]。子数组划分后,再通过相同的方法递归处理两个子数组,最终达到整个数组排序的目的。
2017-09-04 22:15:55 861
原创 线程池原理(四):ScheduledThreadPoolExecutor
ScheduledThreadPoolExecutor用于定时任务,这里的定时意义在于:指定延时后执行任务和周期性重复执行任务。
2017-09-03 10:49:49 20889 2
原创 线程池原理(三):ThreadPoolExecutor
ThreadPoolExecutor就是我们经常说的大名鼎鼎的线程池,Executors工厂创建的线程池都是该类的实例,通过调节参数的大小创建适用于各个场景的线程池。
2017-08-29 21:14:58 2244
原创 线程池原理(二):可执行任务及其返回值
线程池将任务提交和任务执行分离,线程只是一个工作者,它可以执行有返回值的任务,也可以执行没有返回值的任务。Runnable是没有返回值的任务,Callable是有返回值的任务,Future表示任务的执行结果。
2017-08-19 22:30:24 1904 1
原创 Condition详解
JDK的Lock是为了替代synchronized同步锁,Condition是为了替代Object的对象监视器锁。利用Condition,每个对象可以有多个不同的等待集(wait-sets),这样多个线程可以分别在同一个对象的多个等待集上等待,相对于Object的对象监视器锁,Condition提供了更加精细化的锁操作。
2017-08-19 09:19:47 1021
原创 线程池原理(一):基本框架
现代机器CPU基本都是多核系统,利用多线程可以明显提高系统的效率,但是如果不控制线程的使用,会给系统带来严重的后果,因此,JDK提供了线程池供我们使用。有了线程池,每到达一个任务,从线程池调度一个空闲的线程来执行任务,避免了每次都要去创建线程带来的开销。
2017-08-16 23:34:57 1889
原创 桥接模式
桥接模式,将抽象部分和它的实现部分分离,使它们都可以独立地变化,也可以这样理解,实现系统有多角度的分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立的变化,减少它们之间的耦合。
2017-08-15 21:42:00 1595
原创 堆排序
堆排序算法中一般使用二叉堆,最大堆中的子节点值小于父节点的值,因此最大堆的根节点值最大。通过不断的将根节点值移到堆的末尾,并且调整堆使其满足最大堆的特性,达到排序的目的。
2017-08-12 09:32:20 1129
原创 LinkedHashMap源码详解
HashMap查找效率很高,但是也有一个缺点,即遍历HashMap是无序的。LinkedHashMap顾名思义,是链表和哈希表的结合,链表具有天然的有序性,这里的有序不是按照节点大小排序,而是按照节点的插入顺序排序或者节点的访问顺序排序
2017-08-10 22:21:24 804 1
原创 装饰器模式
简单的说,装饰器模式可能动态的给一个对象增加额外的功能。就像人类通过各种服饰来打扮自己一样,对象通过装饰器模式打扮自己,从而拥有更多功能。
2017-08-03 22:15:50 617
原创 redis持久化
redis是内存数据库,所有的数据库状态、键值对都存储在内存中,为了避免数据丢失,可以将数据持久化到磁盘上。redis服务器启动时可以根据持久化文件还原数据库的状态。redis的持久化有两种方式:RDB持久化和AOF持久化。
2017-08-02 21:13:36 599
原创 ReentrantLock源码解析
ReentrantLock是JDK内置的显示可重入锁,相对于隐式锁synchronized,ReentrantLock提供了比synchronized更精细化的锁控制
2017-07-30 09:49:05 621
原创 redis数据库
redis提供了键的失效机制、持久化机制,接下来将介绍redis数据库概念、键的失效机制。redis数据库的服务器状态都保存在redisServer结构中。
2017-07-25 09:09:24 660
原创 HashMap源代码详解
HashMap是键值对的集合,其中键不重复并且可以为空,值也可以为空。HaspMap的存取效率非常高,可以在O(1)时间内实现存取操作。HaspMap的实现是线程非安全的,所以在多线程环境下会有并发问题。
2017-07-16 09:45:42 1189
原创 Map接口和AbstractMap抽象类详解
为了更好的理解JDK的哈希表实现,首先研究Map接口和AbstractMap抽象类,打好基础很重要~
2017-07-09 19:43:40 984
原创 redis对象
前面我们学习了redis各种数据结构,包括简单动态字符串、链表、字典、哈希表、整数集合、压缩列表,其实redis实际不是直接使用这些数据结构的,而是使用称为redis对象的数据结构
2017-07-08 06:44:48 839
原创 Java final关键字详解
final是java的保留关键字,字面意思是”最终的、不可更改的”,对应到java的使用场景完全适用。java的final关键字可以修饰类、方法、成员变量、局部变量、方法参数。
2017-07-03 22:04:12 607
原创 java序列化机制详解
java序列化是将java对象保存在文件或者通过网络传输的机制,通过实现接口Serializable或者Externalizable标识该类的对象可以序列化和反序列化。
2017-07-02 00:30:28 789
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人