Java
文章平均质量分 81
普通网友
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
线性存储结构-ArrayList、Vector
ArrayList:采用数组的内部构建形式,也就是顺序存储模式。当新增一个对象时,如果当前长度超过预设,会使用System.arraycopy(定义一个更长的数组进行复制处理),这个时候开销比较大。System.arraycopy,数组长度小于32的采用的是java层的遍历处理,长数组采用的是native层的处理 /** * The byte array length thresh原创 2016-11-14 16:41:05 · 1173 阅读 · 0 评论 -
设计模式-单例模式
1.单利模式的定义及使用场景确保某一个类只有一个实例,而且自行示例化并向整个系统提供这个实例。确保某个类有且只有一个对象的场景,避免产生多个对象消耗过多的资源,或者某种类型的对象应该有且只有一个。例如创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源,这时就要考虑使用单例模式。2.单例模式的优缺点2.1优点1)减少内存,特别是一个对象需要频繁地创建、销毁,而且创建或原创 2017-01-06 09:33:20 · 654 阅读 · 0 评论 -
设计模式-工厂模式
1.工厂模式的定义及使用场景工厂模式是创建型设计模式之一。定义一个用户创建对象的接口,让子类决定实例化那个类。工厂模式是new一个对象的替代品,所以在所有需要生成对象的地方都可以使用2.工厂模式的优缺点2.1优点1)良好的封装性,代码结构清晰2)具有良好的扩展性,在增加产品类的情况下,只要适当地修改具体的工厂类或扩展一个工厂类,就可以完成需求变化3)典型解耦框架,遵原创 2017-01-10 09:36:16 · 2803 阅读 · 0 评论 -
设计模式-模板模式
1.模板模式的定义及使用场景定义一个操作中的算法框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。使用场景:1)多个子类有公有的方法,并且逻辑基本相同2)重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现3)重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其原创 2017-01-14 09:42:09 · 3006 阅读 · 0 评论 -
设计模式-原型模式
1.原型模式的定义及使用场景定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象使用场景:1)类初始化需要消耗非常多的资源,这个资源包括数据、硬件资源等,通过原型拷贝避免这些消耗2)通过new产生一个对象需要非常繁琐的数据准备或访问权限,这时可以使用原型模式3)一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象原创 2017-02-06 08:40:20 · 1867 阅读 · 0 评论 -
设计模式-抽象工厂模式
1.抽象工厂模式的定义及使用场景抽象工厂也是创建型设计模式之一。为创建一组相关或者是相互依赖的对象提供一个接口,而不需要指定他们的具体类。一个对象族有相同约束时可以使用抽象工厂模式。2.抽象工厂模式的优缺点2.1优点1)良好封装性,低耦合2)产品族内具有约束性,且为非公开状态2.2缺点产品族的扩展非常困难,需要修改抽象工厂及其实现,违背了开闭原则。但工厂原创 2017-01-11 12:13:39 · 2752 阅读 · 0 评论 -
设计模式-中介者模式
1.中介者模式的定义及使用场景定义:中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可以松散耦合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。中介者模式将多对多的相互作用转化为一对多的相互作用。中介者模式将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。使用场景:原创 2017-02-07 09:04:39 · 2025 阅读 · 0 评论 -
设计模式-命令模式
1.命令模式的定义及使用场景定义:命令模式是行为型设计模式之一。将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化;对请求排队或者记录请求日志,以支持可撤销的操作使用场景:需要抽象出待执行的动作,然后以参数的形式提供出来,类似于过程设计中的回调机制,而命令模式正是回调机制的一个面向对象的替代品。在不同的时刻指定、排列和执行请求。一个命令对象可以有与初始请求无关原创 2017-02-08 19:24:03 · 1845 阅读 · 0 评论 -
设计模式-建造者模式
1.建造者模式的定义及使用场景Builder模式是一步一步创建一个复制对象的创建型模式,他允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程。改模式是为了将构造复杂对象的过程和它的部件解耦,使得构建过程和部件的表示隔离开来。1.1定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建同步的表示1.2使用场景相同的方法,不同的执行顺序,产原创 2017-01-18 10:14:02 · 2663 阅读 · 0 评论 -
设计模式-装饰模式
1.装饰模式的定义及使用场景定义:装饰模式也称为包装模式,结构型设计模式之一,其使用一种对客户端透明的方式来动态地扩展对象的功能,同时它也是继承关系的一种替代方案之一。动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活使用场景:需要扩展一个类的功能,或给一个类增加附加功能需要动态地给一个对象增加功能,这些功能可以再动态地撤销需要为一批的兄弟类进行改装或加装功能,当原创 2017-02-20 13:59:51 · 1585 阅读 · 0 评论 -
设计模式-策略模式
1.策略模式的定义及使用场景定义:在软件的开发中常常遇到一个情况,实现某一个功能可以有多种算法或则策略,我们根据实际情况选择不同的算法或则策略来完成该功能。针对这种情况,一种常规的方法是将多种算法写在一个类中,通过if-else等条件判断语句来选择具体的算法,但明显违背了开闭原则和单一责任原则。如果将这些算法或则策略抽象出来,提供一个统一的接口,不同的算法或则策略有不同的实现,这样在程序客户端就可以原创 2017-02-21 10:11:14 · 1503 阅读 · 1 评论 -
设计模式-适配器模式
1.适配器模式的定义及使用场景定义:适配器模式在我们的开发中使用率非常高,从代码中随处可见的Adapter就可以看出来,从最早的ListView、GridView,到现在最新的RecycleView都需要用到Adapter。说到底,适配器就是将两个不兼容的类融合在一起,它有点像粘合剂,将不同的东西通过一种转换使得他们能够协作起来。 适配器模式把一个类在接口变换成客户端所期待的另一种接口,从而使原本原创 2017-02-22 10:10:48 · 1484 阅读 · 0 评论 -
设计模式-责任链模式
1.责任链模式的定义及使用场景定义: 责任链模式是行为型设计模式之一。使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止 使用场景: 使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,只到有对象处理它为止原创 2017-02-14 09:35:39 · 1771 阅读 · 0 评论 -
设计模式-迭代器模式
1.迭代器模式的定义及使用场景定义:迭代器模式又称游标模式,是行为型设计模式之一。其源于对容器的访问,比较java的List、Map、数组等。如果将容器遍历的方法封装在容器中,容器类不仅要维护自身内部的数据元素而且还要对外提供遍历的接口方法,如果不提供遍历的方法而让使用者自己去实现,又会让容器的内部细节暴露。正因于此,迭代模式应运而生。 迭代器模式提供一种方法顺序访问一个容器对象的各个元素,而又不原创 2017-02-23 09:33:18 · 1608 阅读 · 0 评论 -
排序算法总结
1.排序算法分类基础的排序算法包含冒泡排序、选择排序、插入排序、希尔排序、堆排序、归并排序及快速排序。根据实现类型可分为插入排序类、选择排序类、交换排序类及归并排序类。2.排序算法的综合分析各算法的排序方式、平均情况、最好最坏情况、所需的辅助空间及稳定性如下:事实上,排序算法没有十全十美,本来想写一套模拟测试的数据来验证孰优孰略。但是突然发现可比性不高,需要根据原创 2016-12-24 15:19:16 · 2471 阅读 · 0 评论 -
排序算法-快速排序
快速排序(Quick Sort)通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小, 则可分别对这部分记录继续进行排序,以达到整个序列有序的目的最好情况o(logn)最坏情况o(n²)排序稳定,但需要额外的辅助空间 static void quickSort(int[] array, int low, int high) {原创 2016-12-24 11:26:43 · 2343 阅读 · 0 评论 -
线性存储结构-Stack
Stack继承于Vector,是一个模拟堆栈结构的集合类。当然也属于顺序存储结构。这里注意Android在com.android.layoutlib.bridge.impl包中也有一个Stack的实现,继承于ArrayList。构造方法 : public Stack() 创建一个空 Stack。方法: 1. public push (item ) 把项 压入栈顶。其作用与 a原创 2016-11-14 16:43:38 · 1000 阅读 · 0 评论 -
线性存储结构-LinkedList
LinkedList内部采用链表的形式构建,是一个双向链表。除了继承List外,还继承了Deque接口,可以当做堆栈结构使用。 private static final class Link { ET data; //数据 Link previous, next; //前节点、后节点 Link(ET o, Link p, Link n) { data = o; prev原创 2016-11-14 16:46:55 · 2062 阅读 · 0 评论 -
红黑树-TreeMap
1.原理排序二叉树排序二叉树是一种特殊结构的二叉树,可以非常方便地对树中所有节点进行排序和检索。排序二叉树要么是一棵空二叉树,要么是具有下列性质的二叉树:若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;它的左、右子树也分别为排序二叉树。原创 2016-11-30 16:47:53 · 1307 阅读 · 2 评论 -
顺序存储与链式存储的集合-HashMap、HashTable
HashMap,日常最常用的数据结构之一。它是基于哈希表的 Map 接口的实现,以key-value的形式存在。在HashMap中,key-value总是会当做一个整体来处理,系统会根据hash算法来来计算key-value的存储位置,我们总是可以通过key快速地存、取value。下面将通过源码分析存储结构、初始化、插入、查询、移除等来深入分析Hashmap的实现原理。原创 2016-11-24 18:27:59 · 4123 阅读 · 1 评论 -
排序算法-堆排序
堆排序(Heap Sort)堆是具有下列性质的完全二叉树:每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆,或者每个节点的值都小于或等于其左右孩子节点的值,称为小顶堆。堆排序的基本思想是,将待排序的序列构成一个大顶堆。此时整个序列的最大值就是堆顶的根节点。将它移走(其实就是将其余堆数组的末尾就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素的次小值,如此反复原创 2016-12-14 23:25:17 · 2246 阅读 · 0 评论 -
排序算法-冒泡排序
冒泡排序(Bubble BubbleSort)是一种交换排序,他的基本思路是: 两两比较相邻记录的关键字,如果反序则交换。时间复杂度: 1)最好情况:本身有序,需要比较n-1次 时间复杂度为o(n) 2)最坏情况:逆序情况,需要比较(n-1)+(n-2)+...+2+1=n(n-1)/2 时间复杂度为o(n²)每一轮的排序对下一轮的排序有帮助,数字如同气泡慢慢往原创 2016-12-12 17:26:29 · 2004 阅读 · 0 评论 -
排序算法-选择排序
简单选择排序(Simple Selection Sort)就是通过n-i次关键字的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1 时间复杂度: 1) 最好情况:本身有序,需要比较n-1次 时间复杂度为o(n) 2)最坏情况:逆序情况,需要比较(n-1)+(n-2)+...+2+1=n(n-1)/2 时间复杂度为o(n²)性能上略优于冒泡排序 减少了交换原创 2016-12-12 17:36:58 · 2057 阅读 · 0 评论 -
排序算法-插入排序
插入排序(Insert Sort)直接插入排序的基本操作是将一个记录插入到已经排好的有序表中,从而得到一个新的、记录数增1的有序表,类似打扑克牌排列表。时间复杂度: 1)最好情况o(n) 2)最坏情况o(n²/4) 插入排序比选择排序及冒泡排序性能好些 static void insertSort(int[] array) { if原创 2016-12-12 17:42:03 · 2050 阅读 · 0 评论 -
排序算法-希尔排序
希尔排序(Shell Sort)升级版的插入排序,先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2 时间复杂度: 1)最好情况o(n) 2)最坏情况o(n^3/2)性能高于插入排序 但不稳定。算法稳定性:通俗地讲就是能保证排序前2原创 2016-12-12 17:43:59 · 2192 阅读 · 0 评论 -
查找算法-顺序查找、有序查找
1.顺序表的查找1)顺序查找顺序查找又称为线性查找,是一种最简单的查找方法。 从表的一端开始,向另一端逐个按要查找的值key 与关键码key进行比较,若找到,查找成功,并给出数据元素在表中的位置;若整个表检测完,仍未找到与关键码相同的key值,则查找失败,给出失败信息。说白了就是,从头到尾,一个一个地比,找着相同的就成功,找不到就失败。很明显的缺点就是原创 2016-12-06 16:15:44 · 9666 阅读 · 0 评论 -
查找算法-稠密索引、分块索引、倒排索引
1.稠密索引稠密索引时指在线性索引中,将数据集中的每个记录都对应一个索引项 。对于索引项一定是按照关键码有序的排列 索引项有序意味着可以使用顺序查找算法,这是稠密索引的有点, 但是如果数据集非常大,意味着索引也得有同样的数据集长度规模。public class Index { public int key; public Object value; public原创 2016-12-10 10:28:43 · 3591 阅读 · 0 评论 -
排序算法-归并排序
归并排序(Merging Sort)利用归并的思想实现的排序方法。它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列长度为1,然后两两归并,得到[n/2]个长度为2或1的有序子序列然后反复进行两两归并,直到得到一个长度为n的有序序列为止。 时间复杂度 最好情况o(nlogn) 最坏情况o(nlogn) 排序稳定,但需要额外的原创 2016-12-16 17:36:05 · 2317 阅读 · 0 评论 -
设计模式-面向对象的六大设计原则
在应用的开发过程中,最难的不是完成应用的开发工作,而是在后续的升级、维护中让应用系统能够拥抱变化。拥抱变化也就是意味着在满足需求且不破坏系统稳定性的前提下保持高可扩展性、高内聚、低耦合,在经历了各版本的变更之后依旧保持清晰、灵活、稳定的系统架构。虽然在实际的应该开发中,要饱受产品的折磨和摧残、需要在极其有限的研发时间里完成功能、上线。但是我们仍需尽量保持遵循面向对象的六大设计原则,这才能让我们不必原创 2017-01-03 09:39:48 · 762 阅读 · 0 评论 -
设计模式-代理模式
1.代理模式的定义及使用场景代理模式也是委托模式,是结构型设计模式。定义:为其他对象提供一种代理以控制对这个对象的访问使用场景:当无法或不想直接访问某个对象或者访问某个对象存在困难时或者在访问某个对象的前后需要执行一些约定的方法,可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口2.代理模式的优缺点2.1优点1)职责清晰:真原创 2017-02-03 09:47:48 · 2208 阅读 · 0 评论
分享