- 博客(39)
- 收藏
- 关注
转载 JVM学习笔记(1)
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。 下面介绍下内存中各个数据区: PC寄存器/程序计数器(线程私有):程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器 JAVA虚拟机栈(线程私有):生命周期与线程相同,即创建线程的同时...
2018-03-20 15:10:00
89
转载 第13条:使类和成员的可访问性最小化
区别设计良好的模块和设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节。设计良好的模块会隐藏所有的实现细节,把它的API于它的实现清晰地隔离开来。然后,模块之间通过它们的API进行通信,一个模块不需要知道其他模块的内部工作情况,这个概念称为信息隐藏或封装。使类和成员的可访问性最小化可以有效的解除系统中各个模块的耦合度、实现每个模块的独立开发...
2017-04-19 12:01:00
130
转载 第12条: 考虑实现Comparable接口
CompareTo方法没有在Object中声明,它是Comparable接口中的唯一的方法,不但允许进行简单的等同性比较,而且允许执行顺序比较。类实现了Comparable接口,就表明它的实例具有内在的排序关系。为实现Comparable接口的对象排序就这么简单:Arrays.sort(a);实现Comparable好处在于:一旦实现了Comparable接口,它可以跟许多泛型算法以...
2017-04-19 11:18:00
116
转载 第11条:谨慎地覆盖clone
Cloneable接口表明这样的对象时允许克隆的,但这个接口并没有成功达到这个目的,主要是因为它缺少一个clone方法,Object的clone方法是受保护的。如果不借助反射,就不能仅仅因为一个对象实现了Colneable就可以钓鱼clone方法,即使是反射调用也不能保证这个对象一定具有可访问clone方法。既然Cloneable并没有包含任何方法,那么它到底有什么用呢?它其实觉得了...
2017-04-18 21:12:00
116
转载 第10条:始终要覆盖toString
虽然java.lang.Object提供了toString实现,如下public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode());}它包含类名称,一个"@"符号,以及散列码的无符号十六进制表示法。但这一般不是我们所希望看到的...
2017-04-18 20:29:00
76
转载 第9条:覆盖equals时总是覆盖hashCode
在每个覆盖equals方法的类中,也必须覆盖hashCode方法。否则,会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常工作,包括HashMap,HashSet,Hashtbale。下面我们先看下hashCode约定内容: 1.只要对象equals方法的比较操作所用到的信息没有被修改,对同一对象调用多次,hashCode方法都必须返...
2017-04-18 14:29:00
89
转载 第8条:覆盖equals时请遵守通用约定
覆盖equals方法看似很简单,但是有许多覆盖方法或导致错误,避免这些错误最直接的方法就是不覆盖equals。至于什么时候不覆盖equals方法,主要有下面三种: 1:类的每个实例本质上是唯一的。 对于代码活动实体而不是值的类,如Thread,Object提供的equals实现就是这些类的行为 2:不关心类是否提供了“逻辑相等”的测试功能 如Ran...
2017-04-18 11:27:00
108
转载 第7条:避免使用终结方法
本条的意思是,让你尽量不要在你的类中覆盖finalize方法,然后在在里面写一些释放你的类中资源的语句。 至于为什么要避免覆盖并使用finalize呢,理由如下: (1)finalize方法不能保证它能被及时的执行。 (2)finalize方法甚至都不会被执行。 (3)System.gc和System.runFinalization这两个方法只是能增加fi...
2017-04-11 20:57:00
90
转载 第6条:消除过期的对象引用
虽然当我们用完对象后,java有垃圾回收机制进行回收,但是并没有那么的智能,对于某些被引用的对象,就算我们已经不在使用它了,但是java的回收机制是不会回收他们的,人们称之为“内存泄漏”。 很多时候内存泄漏都是“人们无意识的内存引用”造成的,举个简单的例子:List<String> list = new ArrayList<>();Strin...
2017-04-11 20:20:00
106
转载 第5条:避免创建不必要的对象
一般来说,我们最好的做法是重用对象,而不是每次使用都new出一个新的相同功能的对象,这样做很高效,特别是对于那些不可变类来说。看一个极端的反面例子,如果String s = new String("stringette");每次都被执行的话都会创建一个新的实例,然而stringette本身就是String一个实例,功能和构造器创建的对象等,如果这种用法在一个for循环中,或者被频繁调...
2017-04-11 19:47:00
72
转载 第4条:通过私有构造器来强化不可实例化能力
像有些类里面可能只包含静态方法、属性和静态域的类时,而在缺少显示的构造器的时候,编译器会提供一个无参的缺省构造器,由于实例化它们并没有任何意义,所以显然没有必要,这时候我们可以提供一个私有的构造器,这样就不被实例化了,当然,我们最后在构造器中抛出异常来进行说明下,或者加条注释。public class UtilityClass{ private Utility...
2017-04-11 17:09:00
88
转载 第3条:用私有构造器或者枚举类型强化Singleton属性
1:采用私有构造器来强化Singleton属性 顾名思义,即我们需要定义一个private的构造器,但要注意一点,即使我们定义了私有的构造器,但是客户端还是可以借助AccessibleObject.setAccessible方法,通过反射来调用私有的构造器,因此,我们需要修改构造器来抵御这种工具,下面代码很好阐述了这个。public class Singleton {...
2017-04-11 16:52:00
66
转载 第2条:遇到多个构造器参数时要考虑用构建器
由于静态工厂和构造器有个共同的局限性:它们都不能很好地扩展到大量的可选参数。因此我们下面要来说说构建器,所谓的构建器其实就是具有创建外部类功能的内部静态类。首先我们先理解几个模式 1.重叠构造器模式 提供一个只有必要参数的构造器,第二个构造器有一个可选参数,第三个构造器有两个可选参数,依次类推,直到最后一个构造器包含所有的可选参数。 缺点:谁作为第一个可选参...
2017-04-11 13:54:00
87
转载 第1条:考虑用静态工厂方法代替构造器
注:本系列对Effective Java各条进行整理和简洁化,通过书籍和网上博客进行整合,主要参考http://www.jianshu.com/u/3b386b0ef996博主的系列。 首先我们先看下一个类RandomIntBuilder,用来创建随机的Int整数public class RandomIntBuilder { private final i...
2017-04-11 11:10:00
80
转载 设计模式:总结
首先这里先讲下复合模式的定义,复合模式结合两个或以上的模式,组成一个解决方案,解决一再发生的一般性问题。具体场景和例子这里就不介绍了。 好了,现在让我们看下什么是模式。 模式:是在某情境下,针对某问题的某种解决方案。 情境就是应用某个模式的情况下,这应该是会不断出现的情况。 问题就是你想在某情境下达到的目标,但也可以是某...
2017-03-14 18:59:00
58
转载 设计模式:代理模式
代理模式:为另一个对象提供一个替身或占位符以访问这个对象。 在我们学习代理模式之前,我们先了解下代理模式中的三个角色。 抽象角色:声明真实对象和代理对象的共同接口。 代理角色:代理对象角色内部含有真实对象的引用,从而可以操作真实对象。 同时代理对象提供与真实对象相同的接口,以便任何时刻都能替代真实对象。并且代理对象可以在执行真实对象操作时,...
2017-03-13 20:43:00
94
转载 设计模式:状态模式
状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。 策略模式和状态模式时双胞胎,策略模式时围绕可以互换的算法来创建成功业务的。状态模式时通过改变对象内部的状态来帮助对象控制自己的行为。 下面我们看看状态模式的场景 场景1:有一个扭糖果机器,在投入1元硬币后,扭动曲柄,然后机器掉出一颗糖果。 先来看看场景,既然是状态模式,顾名思义,...
2017-03-09 21:14:00
74
转载 设计模式:组合模式
组合模式:允许你讲对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。 在上一节我们讲述了迭代器模式,这节我们讲述的是组合模式,通常组合模式和迭代器模式共用才会达到比较好的效果,接下来我们还是拿上一节讲述的场景,在上个场景中,如果晚餐店的菜单中有甜点这个子餐单,旗下有自己的子菜单项,那么迭代器模式的作用就不怎么明显了,融合后的菜单就...
2017-03-09 16:38:00
104
转载 设计模式:迭代器模式
迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而不是暴露其内部的表示。把游走的任务放在迭代器上,而不是聚合上,这样就简化了聚合的接口,也让责任各得其所。 场景:有一家早餐店和一家晚餐店合并成一家餐厅,现对两个餐厅的菜单进行合并,两家菜单都一样,有name,decription,price,vegetarian属性,而早餐店的菜单是存放在List集合中,晚餐店的菜单存...
2017-03-09 14:26:00
84
转载 设计模式:模板方法
模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。 场景,对于咖啡来说,我们需要把水煮沸,然后用沸水冲泡咖啡,再把咖啡倒入杯子中,最后加入糖和牛奶,对于茶而言,也是先把水煮沸,用沸水去浸泡茶叶,在把茶倒入杯子中,最后加上柠檬。我们可以看这两种方法其实都采用了相同算法,1:把水煮沸 2:...
2017-03-07 19:52:00
55
转载 设计模式:外观模式
外观模式:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。 场景:有一个家庭影院,里面有爆米花机,投影,DVD机,音响等,然后等我们要开始享观赏电影的时候,我们不得不执行打开爆米花机,开始爆米,关闭爆米花机,关闭灯,放在投影....等等一系列操作,然后观赏完电影,还有在关闭这些东西,这多累人啊。这时候,我们就可以利用外观模式,提供一...
2017-03-07 17:05:00
91
转载 设计模式:适配器模式
适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不见人的类可以合作无间。 在生活中,一个二插转换器就是一个适配器,本来不能将二插的插头插入三插插口,利用了这个转换器就可以实现,这个二插转换器在中间起到了一端连接插座,一端连接插头的作用。 场景:之前我们看过鸭子Duck类,现在我们有个火鸡,让我们通过适配器把它伪装成鸭子。 首先创建鸭子和火鸡接...
2017-03-07 11:46:00
216
转载 设计模式:命令模式
命令模式:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。 下面我们利用一个场景来进行理解理解 场景:有一个遥控器,可以控制电灯、音响的开关,遥控器发出一个打开或关闭电灯或音响的请求,这个请求被我们封装成了命令对象。然后将命令对象传给接受者(即电灯或音响),接受者就可以执行命令了。 下面我们就来看看代码的实现。首...
2017-03-06 16:49:00
46
转载 设计模式:策略模式
策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 说白了就是将客户和算法分离开来,下面客户就是Duck的具体类,算法就是封装好的飞行行为,呱呱叫行为。让我们直接看代码吧。 首先创建客户类Duck代码,具体实现类实现抽象类Duckpublic abstract class Duck { //声明飞行行为...
2017-03-06 15:17:00
92
转载 设计模式:装饰者模式
装饰者模式:动态地将责任附加到对象上。想要扩展功能,装饰者提供有别于继承的另一种选择。 现在,我们有一个场景,咖啡店出售各种不同的咖啡,而不同的咖啡中可以加入各种不同的调料,根据咖啡种类和加入的调料来计算价格。下面我们就用代码来简单实现下这个场景,也就是装饰者模式,其中咖啡为主体,调料是用来装饰咖啡的,比如想要一杯摩卡和奶泡的深焙咖啡,那么要做的是: 1:拿一个深焙咖啡...
2017-03-04 15:17:00
60
转载 设计模式:观察者模式
观察者模式:在对象之间定义一对多的依赖,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。 在定义一对多的时候,我们把一称做主题,多称做观察者。下面我们直接看代码来简单了解观察者模式。 第一步:先创建一个主题接口,对象使用此接口来新增、删除、通知观察者。//主题接口,用于添加、删除和通知观察者public interface Subject { ...
2017-03-03 18:59:00
54
转载 RabbitMQ(五)
之前将的创建方法和调用方法都是在本地服务上的,而实际情况肯定是在不同服务器上的,这种模式通常被称为远程过程调用或者RPC。 远程方法调用的注意事项: RPC在软件开发中非常常见,也经常被批评。当一个程序员对代码不熟悉的时候,跟踪RPC的性能问题是出在本地还是远程服务器就非常麻烦,对于RPC的使用,有几点需要特别说明:使用远程调用时的本地函数最...
2017-03-01 17:06:00
145
转载 RabbitMQ(四)
准备: 这节主要讲解Rabbit的发布/订阅。前面我们所讲的是生产者将消息直接放到队列,然后消费者再从队列中获取消息。但实际上,RabbitMQ中消息传递模型的核心思想是:生产者不直接发送消息到队列。实际的运行环境中,生产者是不知道消息会发送到那个队列上,它只会将消息发送到一个交换器,交换器也像一个生产线,一边接收生产者发来的消息,另外一边则根据交换规则,将消息放到队列中。交换器必...
2017-02-24 10:49:00
144
转载 RabbitMQ(三)
这节我们主要讲RabbitMQ的分发,由生产者发布一个任务,多个接受者去获取任务来进行加工处理。下面介绍任务分发 一个队列的优点就是很容易处理并行化的工作能力,但是如果我们积累了大量的工作,我们就需要更多的工作者来处理,这里就要采用分布机制了。 我们创建一个新的生产者NewTaskpackage com.mq;import java.io.I...
2017-02-23 11:41:00
100
转载 RabbitMQ(二)
在学习RabbitMQ之前,我们先简单了解几个概念。 RabbitMQ是什么: RabbitMQ 是一个消息代理。主要的原理就是通过接受和转发消息。 RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,消息中间件主要用于组件之间的解耦。服务器端用Erlang语言编写, 支持多种客户端,如:Python、Ruby、.NET、Ja...
2017-02-22 16:30:00
79
转载 RabbitMQ(一)
前言:RabbitMQ系列LZ是参照http://www.cnblogs.com/LipeiNet/p/5977028.html来学习的,这系列是记录LZ的学习笔记,方便LZ以后回过来复习复习。因为LZ对RabbitMQ来说,还是小白级别,所以会介绍的比较繁琐,如果有基础的,建议直接阅读LZ参照的博客。目前LZ写的RabbitMQ都是比较简单的原理和使用,以后等LZ有能力了,就会写些深入...
2017-02-22 10:43:00
53
转载 Web Service之Axis(二)
AXIS和AXIS2很类似,只是一些文件名和配置不一样,在客户端调用基本一样。WebService一共有四种,在抉择上: 1、如果应用程序需要多语言的支持,Axis2 应当是首选了; 2、如果应用程序是遵循 Spring 哲学路线的话,Apache CXF 是一种更好的选择,特别对嵌入式的 Web Services 来说; 3、如果应用程序没有新的特性需要的话,...
2017-02-21 14:04:00
129
转载 Web Service之CXF(四)
CXF是在xfire的基础上实现的,所以我们学习它会比较简单点。如果需要在现有的java程序(包括web应用)中增加webservice支持,应该使用CXF。如果希望以一种一致的方式实现webservice,特别是有跨语言的需求时,应该使用Axis2。下面我们看看实例。 一:首先还是有关包的问题,创建一个Maven项目,在pom.xml中加入依赖包,根据Apache CXF说明...
2017-02-21 09:56:00
96
转载 设计模式:工厂模式
首先工厂模式分为三种:简单工厂模式、工厂方法模式、抽象工厂模式。下面分别介绍这三种模式。 注:在设计模式中,所谓的“实现一个接口”,并“不一定”表示写一个类,并利用implement来实现某个接口,而是泛指实现某个超类型(可以是接口或类)的某个方法。一:简单工厂模式 简单工厂模式其实不是一个设计模式,反而更想是一种编程习惯。将可变的和不可变的分离出来。 简单工厂模式的...
2017-02-21 09:55:00
97
转载 设计模式:单例模式
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例,并提供一个全局访问点。 使用单例模式的目的在于尽可能节约内存空间,减少GC的消耗。 一个类能否成为单例,主要就是说这些类在应用中如果有两个以上实例会引起一定错误。 首先看下一个最原始的单例模式public class Singleto...
2017-02-21 09:55:00
46
转载 Web Service之Axis2(一)
注:目前LZ写的WerService都是比较简单的原理和使用,以后等LZ有能力了,就会写些深入的内容。 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。 是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进...
2017-02-21 09:55:00
144
转载 Web Service之XFire(三)
首先是使用WSDL协议实现:这里使用XFire,XFire一个免费、开源的SOAP框架,它构建了POJO和SOA之间的桥梁,主要特性就是支持将POJO通过非常简单的方式发布成Web服务,其原理是以接口反射机制自动取得远程方法的什么是wsdl?参考: http://blog.csdn.net/sunchaohuang/archive/2008/10/14/3076375.aspx...
2017-02-21 09:55:00
180
转载 起航
目的: 虽然这一篇是LZ的第一篇博文,但是LZ申请博客到现在已经有1年多了,碍于自己的文笔和惰性,完全是荒废了这个平台,那么为什么LZ突然会开始在这个平台上写下自己的第一篇博文呢?其实很简单,就是为了改变自己的惰性,利用此平台来监督自己。 先要说明下,LZ还是一个初级开发,并不是大牛级别的。那么先简单介绍一下LZ的情况吧。简介: 首先LZ是16年毕业于一所二本院校...
2017-02-21 09:54:00
99
转载 设计模式:开篇
什么是设计模式,为什么我们要学习设计模式呢? 其实设计模式是在软件设计过程中,涉及的常用问题,以及解决这些问题的方案和核心内容。而这些方案和内容就构成了设计模式,它主要是为了让我们解决特地场景下的一系列问题。 下面在学习设计模式之前需要了解设计模式的一些原则,这里我罗列几点重要的规则,具体的使用会在后续各种设计模式中介绍。 设计原则: 1:找出应...
2017-02-21 09:52:00
60
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人