- 博客(80)
- 资源 (10)
- 收藏
- 关注
原创 第13条:使用类和成员的可访问性最小化
第13条:使用类和成员的可访问性最小化简介 区别设计良好的模块和设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏了其内部数据和其他细节。设计良好的模块会隐藏所有的实现细节,把它的API与它的实现清晰地隔离开来。然后,模块之间只通过它们的API进行通信,一个模块不需要知道其他模块内部的工作情况。这个概念被称为信息隐藏(information hiding)或封装(enc
2015-11-20 13:35:31
1079
原创 第12条:考虑实现Comparable接口
第12条:考虑实现Comparable接口Comparable接口简介 compareTo方法并没有在Object中声明。相反,它是Comparable接口中唯一的一个方法。compareTo方法不但允许进行简单的同等性比较,而且允许执行顺序比较,除此之外,它与Object的equals方法具有相似的特性,还是个涉及到泛型的方法。类实现了Comparable接口,就表明它的实例具有内在的排序关
2015-11-19 10:38:57
2530
原创 第11条:谨慎地覆盖clone
第11条:谨慎地覆盖clone Cloneable接口的目的是作为对象的一个mixin接口,这表明这样的对象允许克隆(clone)。遗憾的是,它并没有成功地达到这个目的。其主要的缺陷在于,缺少一个clone方法,object的clone方法是受保护的。如果不借助于反射(reflection),就不能仅仅因为一个对象实现了Clonable接口,就可以调用clone方法。即使是反射的调用也可能失败
2015-11-18 08:21:52
1132
原创 第9条:覆盖equals时总要覆盖hashCode
第9条:覆盖equals时总要覆盖hashCodeHashCode规范 一个很常见的错误根源在于没有覆盖hashCode方法。在每个覆盖了equals方法的类中,也必须覆盖hashCode方法。如果不这样的话,就会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起愉快的正常运作,这样的集合包括HashMap,HashSet以及Hashtable。 下
2015-11-14 11:17:18
1204
原创 第8条:覆盖equals时请遵守通用约定
第8条:覆盖equals时请遵守通用约定无需覆盖 覆盖equlas方法盘起来似乎很简单,但是有许多覆盖方式会导致错误,并且后果非常严重。最容易避免这类问题的办法就是不覆盖equals方法,在这种情况下,类的每个实例都只与它自身相等。如果满足了下面任何一个条件,就是所期望的结果: 1. 类的每个实例本质上都唯一。对于代表活动实体而不是值的类来说的确如此,例如Thread。 2. 不关心类是否提供
2015-11-13 17:36:47
1083
1
原创 第7条:避免使用终结方法
第7条:避免使用终结方法(finalizer)缺点 终结方法(finalizer)通常是不可预测的,也是很危险的,一般情况下是不必要使用它的。使用终结方法会导致行为不稳定,降低性能,以及可移植性的问题,不过终结方法也有其可用之处。 在C++中存在着析构器(destructors)这种帮助回收对象占用资源时的常规方法,是构造器所必需的对应物。但是Java中的终结方法作用并不等同于析构器,当
2015-11-12 11:30:34
1611
原创 第6条:消除过期的对象引用
第6条:消除过期的对象引用 当我们从运用手工管理内存的语言时(例如C或者C++)转换到具有垃圾回收功能语言的时候,程序员的工作会变得更高价容易,因为当用完一个对象之后,它们在之后的时间会被自动回收。好多人可能觉得有人帮着收垃圾有点不太习惯= =,还有的人认为就类似请来了一位清洁工,自己就不用再考虑内存管理的事情了。但是事实上还是需要我们去干涉的,看下面的这个例子: public class S
2015-11-11 13:24:20
1079
原创 第5条:避免创建不必要的对象
第5条:避免创建不必要的对象 一般来说,最好能重用对象,而不是在每次需要的时候就创建一个相同功能的新对象。重用方式既快速,又不需要消耗额外的内存。如果对象是不可变的(immutable),它就始终可以被重用。 下面有一个比较极端的例子- -,看看:String s = new String("stringette"); 该语句每次被执行的时候都创建一个新的String实例,但是这
2015-11-10 15:14:32
818
原创 第4条:通过私有构造器强化不可实例化的能力
第4条:通过私有构造器强化不可实例化的能力 有时候可能只需要编写包含静态方法和静态域的类。这些类的名声很不好,因为有些人再面向对象的语言中滥用这些类来编写过程化的程序。尽管如此,他们也确实有他们特有的用处。我们可以利用这种类,把基本类型的值或者数组类型上的相关方法组织起来,也可以把实现特定接口上的静态方法组织起来,还可以利用这种类把final类上的方法组织起来,以取代扩展该类的做法。 这
2015-11-10 12:12:45
905
原创 第3条:用私有构造器或者枚举类型强化Singleton属性
第3条:用私有构造器或枚举类型强化Singleton属性 单例模式(Singleton):当系统中只需要的某个类的唯一对象时,可以使用该模式。Singleton指仅仅被实例化一次的类。Singleton通常被用来代表那些本质上唯一的系统组件。 为什么会用到该模式?因为有时候某些对象的创建需要耗费大量的资源、使用单一(唯一)的对象实例来维护某些共享数据等,在这些场景下即可采用单例模式进行设
2015-11-09 12:28:42
1008
原创 RecyclerView中的ViewType
RecyclerView中的ViewType1. 前言 在接触了RecyclerView了之后,就慢慢的用它代替了ListView的使用,结合CardView能创建出比较好看的列表,但是这根本就不够诶,单纯的列表好像没什么意思了,好多应用的信息量比较大而且很复杂,每个item需要用到不同的布局文件来显示不同的信息= =,之前写来写去都是简单的列表,根本就没接触到ViewType这个东西,稍微熟
2015-10-18 11:01:05
6575
原创 Volley框架解析(七)-----Request解析
Volley框架解析(七)—–Request解析1. 前言(可直接无视跳过= = ·一路过关斩将= =,从最顶层一路看代码,了解了request队列的调度程序,request结果的处理方式,以及request请求出错的处理方式,对请求结果进行缓存方面的工作等等。这篇博客就轮到Volley中的主角出场了,那就是—Request.java,前面一直在说request,但是一直都没有介绍到Reque
2015-09-20 09:07:42
2002
原创 Volley框架解析(六)-----Cache接口及其默认实现类解析
Volley框架解析(六)—–Cache接口及其默认实现类解析1. 前言(可直接无视跳过 不知不觉Volley的源码分析到了Cache接口部分了,前面涉及到网络的部分都介绍完了,在处理网络请求返回的数据时,会根据request结果是否需要缓存来进行不同的处理。如需要缓存结果,就涉及到了Cache.java及其默认实现类DiskBasedCache.java。 其实在之前什么都不知道的时候,认为
2015-09-17 17:31:16
1731
原创 Volley框架解析(五)-----HttpStack接口及其默认实现类解析
Volley框架解析(五)—–HttpStack接口及其默认实现类解析1. 前言(可直接无视跳过= = 历经前面的四篇,终于涉及到网络请求核心的内容了,前面都在做一些准备工作,以及对request队列调度以及维护工作。之前一直说,httpResponse = mHttpStack.performRequest(request, headers);这句话是网络请求的核心,因为这句话一出来,神不知
2015-09-17 08:33:22
1740
原创 Volley框架解析(四)-----Network接口及其默认实现类解析
Volley框架解析(四)—–Network接口及其默认实现类解析1. 前言(可直接无视跳过 前面的三篇Volley框架解析文章已经从Volley对外暴露的接口Volley.java开始,向下慢慢深入到了RequestQueue.java,这个Volley中比较核心的类,然后又分析了Volley中负责主要request调度工作的两类Dispatcher,NetworkDispatcher以及C
2015-09-16 14:45:41
1651
原创 Volley框架解析(三)-----Dispatcher解析
Volley框架解析(三)—–Dispatcher解析题外话(可直接无视,跳过~ 在上一篇博客中结合volley源代码分析了Volley.java和RequestQueue.java这两个类,不知道代码全贴上去了,会不会看着很烦的嗯= =,当时看源代码的时候心里就有些不淡定,满屏幕看不懂的东西,但是个人觉得源代码和注释一起看才方便,一段代码一段解释会感觉有点摸不着头脑= =。前面的博客中一直提
2015-09-13 21:48:50
1779
原创 Volley框架解析(二)-----Volley及RequestQueue解析
Volley框架解析(二)—–Volley.java及RequestQueue.java解析题外话(可直接无视跳过 这是第一次比较完整的去阅读一个框架的源码,刚开始看的时候可以说是除了认识几个基本的public, interface, final等关键词之外,其他的一律不通orz,而且还不知道从哪里下手。后来磨蹭了好久还是慢慢的静下心来,对照着Java文档和Android文档查阅,刚开始都是陌
2015-09-12 14:28:06
2818
原创 Volley框架解析(一)-----整体介绍
Volley框架解析(一)—–整体介绍 感谢各位菊苣,grumoon,huxian99,trinea,郭霖juju的图片素材,以及详细的分析。 其他菊苣关于Volley解析的链接如下: codeKK—Volley源码解析 郭霖juju—Android Volley完全解析(一),初识Volley的基本用法题外话(可直接跳过orz 在Android路上的第一个涉及到网络的
2015-09-11 07:40:49
1611
1
原创 Android应用实现微信登录与分享
Android应用实现微信登录与分享 1. 闲话(可直接无视 项目慢慢的推进,逐渐的做到了微信第三方登录的功能模块了。其实我想说Orz,我等这一天等了好久了,想做个微信验证登录都等了两个多星期咧(其实是我们这边出了点问题),先要申请微信开放平台的帐号,在里面创建一个应用,通过审核之后再交300软妹币,是的,你没有听错,上交300软妹币(听说会成为传说中的认证开发者)才可以获得应用第三方登
2015-08-05 11:57:03
10362
3
原创 WebView使用总结
WebView使用总结闲话(可直接无视 好久都没有上博客写点东西,总结下最近的学习情况了,又是课程设计又是项目的,都快被弄成XX了。最近又接了个锅,做一个能社交的游记应用,游记的内容由用户编辑好之后上传给服务器,由前端写好不同模板后将图片放入模板,前段还是很溜的,写出来的模板都蛮好看的呢(射鸡湿也很厉害呢,Android这边需要通过WebView去浏览已经处理好的游记。第一次接触到了WebVi
2015-07-31 10:32:54
2273
原创 桶排序
桶排序①简介 桶排序假设输入数据服从均匀分布,平均情况下它的时间代价为O(n)。桶排序假设输入是由一个随机过程产生,该过程将元素均匀,独立的分布在[0,1)区间上。②原理 桶排序将[0,1)区间划分为n个相同大小的子区间,或称为桶。然后将n个输入的数据分别放到各个桶中。因为输入数据是均匀分布的,一般不会出现很多数落在一个桶中的情况。为了得到输出结果,先对每个桶中的数据进行排序,再遍历每个
2015-07-01 08:49:23
1506
原创 基数排序
基数排序①简介 基数排序是一种用在卡片排序机上的算法,一张卡片有80列,在每一列上机器可以选择在12个位置中的任意一处穿孔。通过机器的操作,能够“编程”来检查每个卡片中的给定列,然后根据穿孔的位置将他们分别放在12个容器中。操作员就可以挨个容器来收集卡片,其中第一个位置穿孔的卡片在最上面,以此类推。②原理 直观上来看,可能会认为应该先按照最高有效位进行排序并分装到不同的容器中,再对每个容
2015-06-29 13:29:15
1581
原创 计数排序
计数排序原理 计数排序的基本思想是:对于每一个输入元素x,确定小于x的元素个数。根据这些信息,就能准确的将每个数字放在正确的位置上。 在排序的过程中,除了输入数组A[n]之外,还需要一个记录结果的数组B[n]和一个记录小于x数的个数数组C[num_max]。A与B的数组等长,而C数组的长度则为n个数中的最大者。 上图为计数排序的一系列过程,下面依次做分析:(a)中显示了原始数组A
2015-06-27 09:45:50
1311
原创 快速排序
快速排序原理 和之前学习到的归并排序一样,快速排序也使用了分治的思想。假设现有一个数组a[start,end],对这个数组进行快速排序分了下面三个步骤:分解:在数组a[start,end]中确定一个标准(一般是找a[end]),以这个标准调整元素并找出一个位置p,使得start<=i<=p-1区域内的所有元素都小于等于a[end],而p+1<=i<=end这个区域中所有元素都大于等于a[en
2015-06-24 16:33:11
1189
原创 最大优先队列
最大优先队列前言 堆排序是一种集插入排序和选择排序的有点于一身的排序算法,但是在后面能学习到更加好的快速排序算法,性能优于堆排序。堆这钟数据结构还有许多其他的用处,例如作为高效的优先队列。优先队列分为最大优先队列和最小优先队列,今天学习了如何用最大堆来实现最大优先队列。 优先队列是一种用来维护由一组元素构成的集合S的数据结构,其中的每一个元素都有一个相关的值,称为关键字。一个最大优先队列
2015-06-24 10:24:12
1870
原创 堆排序
堆排序前言 堆排序和归并排序一样,时间复杂度都是O(nlg(n)),和插入排序相同的是具有空间的原址性:任何时候都只需要常数个额外的空间元素存储临时数据。因此堆排序可以说是结合了之前讨论的两种排序算法的优点。 (二叉)堆又是一个数组,它可以被堪称一个近似的完全二叉树,树上的每一个节点都对应着数组中的一个元素。从图中可以看到,除了叶节点之外,该树是完全充满的,而且是从左向右的填充。很容易就
2015-06-22 15:11:02
1450
原创 最大子数组的和
最大子数组的和 在给定的一个数组中,找出连续的一部分数组,使其中的元素和最大。例如输入1,-2,5,3,-3,7,-2,-1,输出的最大子数组和为12。 ①如果什么都不考虑,用最直接的办法来求解,即三重for循环来暴力求结果,该算法的时间复杂度为O(n^3)代码如下://本段代码引自编程之美int MaxSum(int* A, int n){ int maximum = -INF;
2015-06-21 14:37:18
1280
2
原创 选择排序
选择排序 1)原理:对于一个将要排序的数组A[n],先找出最小元素(升序排列),将其与A[0]交换,接着在数组下标为1~n-1的元素中寻找最小值,与A[1]交换,直到排序结束。 2)C语言实现:void main(){ int t,temp,count, *p; printf("please input the count :"); scanf_s("%d",
2015-06-18 11:10:48
1311
原创 归并排序(MERGE_SORT)
归并排序(MERGE_SORT) 1)分治思想 :归并排序用到了一种称为分治法的设计方法,分治法的思想就是将原问题的分解成为几个规模小的但是类似于原问题的子问题,递归的求解子问题,之后再合并子问题的解,来组成原问题的解。 2)原理 :根据分治方法的思想,归并排序算法的基本操作分为三大步:分解,解决问题,合并结果。以一个需要排序的数组为例,分解也就是不停地递归分解问题,直到问题的规模降为1
2015-06-18 11:09:31
1249
原创 插入排序(INSERTION_SORT)
插入排序(INSERTION_SORT) 1)原理 : 插入排序对于少量的元素排序是一个有效的算法。插入排序的工作方式像是在拿扑克牌一样,最开始的时候手里是空的,每抽到一张牌就将其在另一只手上按一定的规律排好序,直到所有的元素排列完成。 2)C语言实现 :#include<stdio.h>#include<cstdlib>void sortNum(int count, int *a)
2015-06-18 11:08:26
1604
原创 Thinking In Java笔记(第八章 多态)
第八章 多态 在面向对象的程序设计语言中,多态是继抽象和技能之后的第三种基本特征。多态不但能够改善代码的组织结构和可读性,还能够创建可扩展的程序。 多态的作用是用来消除类型之间的耦合关系。8.1 再论向上转型 将某个对象的引用视为对其基类对象的做法被称作向上转型。但是这样做也有问题。看如下的例子: public enum Note { MIDDLE_C
2015-06-10 10:19:57
1893
原创 Thinking In Java笔记(第七章 复用类)
第七章 复用类 复用代码是Java众多引人注目的功能之一,但想要成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它还必须能够做更多的事情。 Java中所有事物都是围绕着类来展开的。通过创建新类来复用代码,不必重新开头编写。此方法的窍门在于使用类而不破坏现有程序代码。本章中有两种代码重用机制来达到这一目的:只需要在新的类中生成现有类的对象。由于新的类是由现有类的对象所组成的
2015-05-30 09:54:18
2053
原创 Java代理模式
Java代理模式 代理可以分为:静态代理(StaticProxy)和动态代理(DynamicProxy)。代理概念 为某个对象提供一个代理,以控制这个对象的访问。代理类和委托类有共同的父类和父接口,这样在任何使用委托类对象的地方都可以使用代理对象代替。代理类负责请求的预处理、过滤、将请求分派给委托类处理以及委托类执行完请求后后的后续处理。代理分为了静态代理和动态代理。 个人感觉代理
2015-05-17 12:36:56
1764
原创 Java反射机制学习笔记
Java反射机制简介 通过反射API可以获取程序在运行时刻的内部结构。反射API中提供的动态代理可以原生实现AOP中的方法拦截功能。通过反射获取到的Java类内部结构后再进行运用,和直接运用这个类效果相同,但额外的提供了运行时刻的灵活性。反射的最大一个弊端是性能比较差。相同的操作,用反射API所需的时间大概比直接的使用要慢一两个数量级。可以考虑在适当的时机来使用反射API。基本用法 Ja
2015-05-16 15:36:59
1667
原创 Java垃圾回收(二) 堆内存的分代回收
堆内存的分代回收 Java针对堆的垃圾回收,将堆分为了三个较小的部分:新生代、老年代、持久代。新生代主要使用复制和标记-清除垃圾回收算法,年老代主要使用标记-整理垃圾回收算法,因此java虚拟中针对新生代和年老代分别提供了多种不同的垃圾收集器。1. 分代回收的依据:对象生存时间长短:大部分对象在Young期间就被回收。不同代采用不同的垃圾回收策略:对存活时间不同的对象分类,用不同的垃圾回收
2015-05-11 15:26:53
2558
原创 Thinking In Java笔记(第六章 访问权限控制)
第六章 访问权限控制简介 Java提供了访问权限修饰词,供类库开发人员向客户端程序员指明哪些是可用的,哪些是不可用的。访问权限控制的等级,从最大权限到最小权限一次为:public、protected、包(library)访问权限(没有关键词)以及private。6.1 包(library):库单元 包内含有一组类,它们在单一的名字控件之下被组织在一起。例如,在Java的标准发布中有一个工
2015-05-11 11:41:01
1872
原创 Java垃圾回收(一) 内存回收简介
Java垃圾回收(一) 在Java中,它的内存管理包括两个方面:内存分配和内存回收,这两个方面的工作都是由JVM自动完成的,降低了Java程序员的学习难度,避免了像C/C++直接操作内存的危险。但这也使很多程序员不关心内存分配的问题,导致很多程序低效耗费内存。 Java语言规范没有明确的说明JVM使用哪种垃圾回收算法。一般常用的算法有下列几种:引用记数法(Reference Count
2015-05-08 10:03:42
1864
原创 Thinking In Java笔记(第五章 初始化与清理(三))
第五章 初始化与清理5.6 成员初始化 Java尽力保证:所有变量在使用前都能得到恰当的初始化。对于方法的局部变量,Java以编译错误的形式来保证。如下:void f() { int i; i++; //Error:i not initialized} 会得到一条错误的消息,提示i可能没有初始化。编译器可以给i赋初值,但是并没有这么做,因为没有初始化是程序员的疏忽,为
2015-05-06 09:09:58
1667
原创 Thinking In Java笔记(第五章 初始化与清理(二))
第五章 初始化与清理(二)5.5 清理:终结处理和垃圾回收 清理的工作常常被忽略,Java有垃圾回收器负责回收无用对象占据的内存资源。但也有特殊情况:假定对象(并非使用new)获得了一块”特殊”的内存区域,由于垃圾回收器只知道释放那些由new分配的内存,所以不知道如何释放特殊内存。Java允许在类中定义一个名为finalize()的方法,工作原理”假定”是这样的:一旦垃圾回收器准备好释放对象占
2015-05-05 12:16:13
1833
原创 Thinking In Java笔记(第四章 控制执行流程)
第四章 控制执行流程 Java中使用了C的所有流程控制语句。在Java中涉及的关键字包括if-else,while,do-while,for,return,break,continue以及选择语句switch。然而Java不支持goto语句(该语句引起了许多的反对意见),但是Java仍然可以类似goto那样跳转。4.1 True和False 所有的条件语句都利用条件表达式的真假来决定执行
2015-04-29 10:15:25
1427
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人