自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

牛崽的博客

何时成为大牛

  • 博客(40)
  • 问答 (3)
  • 收藏
  • 关注

原创 十五、建造者模式Builder(创建型模式)

Builder设计模式类似于Factory,都是用于生产一种产品,但是他们之间还是有一些区别的。至于有什么区别,仁者见仁,智者见智,我会在介绍完Builder模式之后说说我自己的看法,当然我的想法也参考了很多其他人的看法。下面先看一个例子吧:     当要生产的一种产品具有相同的结构,并且每个构件的生产都很繁杂,就可以用Builder模式将具体构件的生产与整个成品的组装分离开来。还是拿本文

2016-04-22 16:28:02 448

原创 十四、原型模式Prototype(创建型模式)

1:原型模式的本质原型模式的本质:克隆生成对象。克隆是手段,目的还是生成新的对象实例。正是因为原型的目的是为了生成新的对象实例,原型模式通常是被归类为创建型的模式。原型模式也可以用来解决“只知接口而不知实现的问题”,使用原型模式,可以出现一种独特的“接口造接口”的景象,这在面向接口编程中很有用。同样的功能也可以考虑使用工厂来实现。另外,原型模式的重心还是在创建新的对象实例,至于创建

2016-04-22 16:04:54 3837 1

原创 十三、工厂模式Factory(创建型模式)

一、引子       话说十年前,有一个暴发户,他家有三辆汽车——Benz奔驰、Bmw宝马、Audi奥迪,还雇了司机为他开车。不过,暴发户坐车时总是怪怪的:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上Audi说“开奥迪车!”。你一定说:这人有病!直接说开车不就行了?!       而当把这个暴发户的行为放到我们程序设计中来时,会发现这是一个普遍存在的现象。幸运

2016-04-22 15:30:06 3393 1

原创 十二、单例模式Singleton(创建型模式)

确保类只有一个实例,并提供访问它的一个全局点。第一种(懒汉,线程不安全): public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == nul

2016-04-21 18:29:04 382

原创 十一、访问者模式(行为型模式)

使用这个模式后就可以在不修改已有程序结构的前提下,通过添加额外的“访问者”来完成对已有代码功能的提升表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 特点访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化。访问者模式适用于数据结构相对稳定算法又易变化的系统。因为访问者模式使得

2016-04-21 17:44:39 238

原创 十、责任链模式Chain of Responsibility(行为型模式)

单向的责任链interface Filter { String doFilter(String str);}class FilterChain implements Filter { List filters = new ArrayList<>(); public FilterChain addFilter(Filter f) { this.filters.a

2016-04-21 17:31:23 347

原创 九、策略模式Strategy(行为型模式)

定义一系列算法,封装每个算法,使它们可以互换,策略允许算法随使用它的客户的不同而不同。public class Test { public static void main(String[] args) { //-----------------// int[] a={1,3,2,6,4}; DataSorter.sort(a); Dat

2016-04-21 16:58:13 270

原创 八、状态模式State(行为型模式)

允许对象在其内部状态变化时改变其行为,对象看起来会改变其类。缺点也显而易见了,如果状态太多了,对应的状态类也会比较多的。。比如一个MM在她高兴与不高兴时候她的行为是不一样的:abstractclass MMState{ public abstract void smile(); public abstract void cry(); public abstr

2016-04-21 16:47:19 636

原创 七、备忘录模式Memento(行为型模式)

其目的是,在不违反封装原则的前提下.采集和备份一个对象的内部状态以便这个对象可以在以后恢复到之前的某个状态.在Memento模式中,有如下角色:Memento (备忘录)* 存储Originator的内部状态. 根据Originator的需要.可以存储任意的内部状态.* 保护对状态的访问.除了Originator对象外,其他对象不能访问其存储的内部状态.Memeoto实

2016-04-21 16:37:14 4138

原创 Android LRU缓存算法实现

什么是LRU算法? LRU是Least Recently Used的缩写,即最少使用页面置换算法,是为虚拟页式存储管理服务的。可以参考这两篇:说说Android LRU缓存算法实现学习笔记(一)说说Android LRU缓存算法实现笔记(二)--LRU的应用

2016-04-19 21:24:53 612

原创 六、中介者模式Mediator(行为型模式)

简述调停者模式(Mediator pattern)软件设计模式的一种,用于模块间解耦,通过避免对象互相显式的指向对方从而降低耦合。问题① 多个对象重复访问,无规律性。② 一个对象集合的交互良好定义,但是交互方式复杂。通常有非结构依赖。③ 对象复用困难,因为对象指向和交互很多其他的对象④ 在多个类之间的分布式行为的控制问题:应该不用建立很多子类就是先本地化参与者说明①

2016-04-19 18:11:25 358

原创 7--树

定义:树(tree)是包含n(n>0)个结点的有穷集,其中:(1)每个元素称为结点(node);(2)有一个特定的结点被称为根结点或树根(root)。(3)除根结点之外的其余数据元素被分为m(m≥0)个互不相交的集合T1,T2,……Tm-1,其中每一个集合Ti(1结点(Node):一个数据元素及其若干指向其子树的分支。结点的度(degree)、树的度

2016-04-19 16:54:53 444

原创 8--二叉树遍历

1.先(根)序遍历的递归算法定义:若二叉树非空,则依次执行如下操作:⑴ 访问根结点;⑵ 遍历左子树;⑶ 遍历右子树。2.中(根)序遍历的递归算法定义:若二叉树非空,则依次执行如下操作:⑴遍历左子树;⑵访问根结点;⑶遍历右子树。3.后(根)序遍历得递归算法定义:若二叉树非空,则依次执行如下操作:⑴遍历左子

2016-04-19 16:48:36 313

原创 6--队列

队列是一种运算受限的线性表。是一种先进先出的(First in First Out,FIFO)的线性表。只允许在表的一段进行插入,而在另一段进行删除。队首:允许进行删除的一段称为队首。队尾:允许进行插入的一段称为队尾。循环队列:为充分利用向量空间,克服“假溢出”现象,将对咧分配的向量空间看成为一个首尾相接的圆环,并称这种对咧为循环队列。顺序存储:linkqueue.

2016-04-19 16:05:24 279

原创 5--栈

Stack基本概念栈是一种特殊的线性表,也就是具有线性关系,即前驱后继关系。只不过它是一种特殊的线性表而已。定义中说在线性表的表尾进行插入和删除操作,这里表尾是指栈顶,而不是栈底。栈仅能在线性表的一端进行操作栈顶(Top):允许操作的一端栈底(Bottom):不允许操作的一端它的特殊之处就是在与限制了这个线性表的插入和删除位置,它始终只在栈顶进行,也就是:栈顶是固定的,最先

2016-04-19 15:51:04 241

原创 4--循环链表

1、基本概念循环链表的定义:将单链表中最后一个数据元素的next指针指向第一个元素循环链表拥有单链表的所有操作:创建链表销毁链表获取链表长度清空链表获取第pos个元素操作插入元素到位置pos删除位置pos处的元素游标的定义在循环链表中可以定义一个“当前”指针,这个指针通常称为游标,可以通过这个游标来遍历链表中的所有元素。循

2016-04-19 15:29:41 2354

原创 3--双向链表

1、基本概念单链表的结点都只有一个指向下一个结点的指针单链表的数据元素无法直接访问其前驱元素逆序访问单链表中的元素是极其耗时的操作!len = LinkList_Length(list);for (i=len-1; len>=0; i++) //O(n){LinkListNode *p = LinkList_Get(list, i); //O(n)//访问数据元

2016-04-18 17:41:14 402

原创 2--线性表的链式存储

1、基本概念链式存储定义为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息。表头结点链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息数据结点链表中代表数据元素的结点,包含指向下一个数据元素的指针和数据元素的信息尾结点链表中的最后一个数据结点,其下一元素指针为空,表示无后继

2016-04-18 17:29:33 323

原创 1--线性表的顺序存储结构

线性表定义线性表(List)是零个或多个数据元素的集合线性表中的数据元素之间是有顺序的线性表中的数据元素个数是有限的线性表中的数据元素的类型必须相同数学定义线性表是具有相同类型的 n(≥ 0)个数据元素的有限序列(a1, a2, …, an)ai是表项,n 是表长度。性质a0为线性表的第一个元素,只有一个后继 an为线性表的最后一个元素,只有一个

2016-04-18 17:21:19 387

原创 十二、Dijkstra算法

戴克斯特拉算法(Dijkstra’s algorithm)是由荷兰计算机科学家艾兹赫尔·戴克斯特拉提出。迪科斯彻算法使用了广度优先搜索解决非负权有向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法或者作为其他图算法的一个子模块。该算法的输入包含了一个有权重的有向图 G,以及G中的一个来源顶点 S。我们以 V 表示 G 中所有顶点的集合。每一个图中的边,都是两个顶点 所

2016-04-18 17:01:22 447

原创 十一、广度优先搜索(BFS)

广度优先搜索算法(Breadth-First-Search),是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树(图)的宽度遍历树(图)的节点。如果所有节点均被访问,则算法中止。BFS同样属于盲目搜索。一般用队列数据结构来辅助实现BFS算法。详细解释已知图G=(V,E)和一个源顶点s,宽度优先搜索以一种系统的方式探寻G的边,从而“发现”s所能到达的所有顶点,并计算s到所有这

2016-04-18 16:52:18 403

原创 十、深度优先搜索(DFS)

深度优先搜索算法(Depth-First-Search),是搜索算法的一种。它沿着树的深度遍历树的节点,尽可能深的搜索树的分 支。当节点v 的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发 现的节点, 则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。DFS属于盲目搜索。深度

2016-04-18 16:12:47 460

原创 九、线性查找(BFPRT)

BFPRT算法解决的问题十分经典,即从某n个元素的序列中选出第k大(第k小)的元素,通过巧妙的分 析,BFPRT可以保证在最坏情况下仍为线 性时间复杂度。该算法的思想与快速排序思想相似,当然,为使得算法在最坏情况下,依然能达到o(n)的时间复杂 度,五位算法作者做了精妙的处理。算法步骤:1. 将n个元素每5个一组,分成n/5(上界)组。2. 取出每一组的中位数,任意排序方法

2016-04-18 16:03:45 468

原创 八、二分查找

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重

2016-04-18 15:58:43 257

原创 七、堆排序

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。定义n个关键字序

2016-04-18 15:49:46 277

原创 六、归并排序

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1

2016-04-18 15:28:35 240

原创 五、快速排序

快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。算法介绍设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数

2016-04-18 15:07:41 234

原创 四、希尔排序

希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。基本思想先取一个小于n的整数

2016-04-18 14:49:25 560

原创 三、冒泡排序

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。算法原理1、比较相邻的元素。如果第一个

2016-04-18 14:31:42 1098

原创 二、插入排序

有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元

2016-04-18 14:21:32 377

原创 一、选择排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)通俗的解释对比数组中前一个元素跟后一个元素的大小,如

2016-04-18 10:27:03 289

原创 五、观察者模式Observer(行为型模式)

定义定义对象之间的一对多依赖关系,当一个对象改变状态时,它的所有依赖对象都会自动获得通知。观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监听一个主题对象。这样一来,当被观察者状态发生改变时,需要通知相应的观察者,使这些观察者对象能够自动更新。关键要素主题主题是观察者观察的对象,一个主题必须具备下面三个特征。持有监听的

2016-04-15 18:29:29 2856

原创 四、迭代器模式Iterator(行为型模式)

迭代器模式为顺序访问集合对象的元素提供一种方式,且不暴露其底层表示法。package interator; publicclass Test1 { publicstaticvoid main(String[] args) { // ArrayList al = new ArrayList(); LinkedList al = new LinkedLi

2016-04-15 18:13:53 643

原创 三、命令模式Commond(行为型模式)

命令模式将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作。package commond;import java.util.ArrayList;import java.util.List;publicclass CommondTest {}class MM { String name; publ

2016-04-15 17:36:09 673

原创 零、设计模式基础

1、变与不变的分离是设计Hook函数及应用框架的基本原则和手艺。就android框架而言,所谓[不变]的部分,就是它属于各种应用程序件的共同部分,所以不随着应用的改变而改变,因此称之为不变。分离出变与不变部分之后,就可以将不变部分写在父类别里,而不变的部分就写在子类别里,然后就有类别继承机制组织起来。public class AA {private String x;AA(Stri

2016-04-15 16:26:53 272

原创 二、模版模式与回调Template Method(行为型模式)

模版模式又叫模板方法模式,在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情冴下,重新定义算法中的某些步骤。我们使用冲泡咖啡和冲泡茶的例子加工流程:咖啡冲泡法:1.把水煮沸、2.用沸水冲泡咖啡、3.把咖啡倒进杯子、4.加糖和牛奶茶冲泡法:   1.把水煮沸、2.用沸水冲泡茶叶、3.把  茶 倒进杯子、4.加蜂蜜 实践步骤:

2016-04-15 15:52:46 337

原创 一、Hook(抽象)函数

看完高焕堂老师的视频,自己总结下知识。所谓的Hook,就是用来接合两个东西的接口。如果两个东西于不同时间出现,则一方会预留空间,给予另一方于未来时刻能以实体来填补该空间,两者虚实相依,就密合起来了。Hook函数是Android框架与应用类别的接合处。Android以来类的继承的可Overridable函数来作为主要的Hook函数。C++例子://Ex02-01.cpp#inclu

2016-04-15 15:13:02 5278 1

转载 Java NIO:NIO概述

在上一篇博文中讲述了几种IO模型,现在我们开始进入Java NIO编程主题。NIO是Java 4里面提供的新的API,目的是用来解决传统IO的问题。本文下面分别从Java NIO的几个基础概念介绍起。  以下是本文的目录大纲:  一.NIO中的几个基础概念  二.Channel  三.Buffer  四.Selector  若有不正之处,请多多谅解并欢迎批评指正。  请

2016-04-13 11:44:39 269

转载 Java NIO:浅析I/O模型

也许很多朋友在学习NIO的时候都会感觉有点吃力,对里面的很多概念都感觉不是那么明朗。在进入Java NIO编程之前,我们今天先来讨论一些比较基础的知识:I/O模型。下面本文先从同步和异步的概念 说起,然后接着阐述了阻塞和非阻塞的区别,接着介绍了阻塞IO和非阻塞IO的区别,然后介绍了同步IO和异步IO的区别,接下来介绍了5种IO模型,最后介绍了两种和高性能IO设计相关的设计模式(Reactor和Pr

2016-04-13 11:44:02 296

转载 Java并发编程:线程池的使用

在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:  如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。  那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?  在Java中可以通过线程池来达到这样的

2016-04-13 11:03:06 239

空空如也

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

TA关注的人

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