Effective java中文版2
文章平均质量分 68
风中飘摇我亦妖娆
大丈夫生于天地间
展开
-
Comparable与Comparator浅析
博客地址:点击打开链接今天博主在翻阅TreeMap的源码,发现其键必须是实现Comparable或者Comparator的接口时产生了一些兴趣,比如在TreeMap中的put方法分别对Comparable和Comparator接口分别进行处理。那么疑问就来了,Comparable和Comparator接口的区别是什么,Java中为什么会存在两个类似的接口? Compa转载 2017-09-04 07:58:11 · 166 阅读 · 0 评论 -
接口和抽象类可以被new嘛?——顺便总结内部类
背景: 最近有同事跟我说了他面试时遇到的问题,考官问:“接口和抽象类可以被new嘛?”。这可能不是考官的原话,但是据他表达考官大概就是这个意思了。听到这个问题,我的第一反应是肯定不行啊,直接对接口和抽象类调用new,编译器都过不去。但是他说,考官说可以,用匿名内部类实现。听见这个回到,我感觉那个考官太…………,有点无语。我们可以仔细分析下这个问题。直接new接口和转载 2017-12-04 14:29:07 · 252 阅读 · 0 评论 -
第48条:如果需要精确的答案,请避免使用float和double
float和double主要为了科学计算和工程计算而设计,执行二进制浮点运算,这是为了在广泛的数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不适合用于需要精确结果的场合,尤其是货币计算。//假设有1.03元,花掉0.42元后System.out.println(1.03 - .42);//0.6100000000000001System.ou转载 2017-12-04 14:30:03 · 260 阅读 · 0 评论 -
第49条:基本类型优先于装箱基本类型
Java 1.5增加自动装箱和自动拆箱,对应基本类型int、double、boolean,装箱基本类型是Integer、Double、Boolean。这两种类型之间差别。 基本类型和装箱基本类型之间的三个主要区别:1.基本类型只有值,而装箱基本类型具有与它们的值不同的同一性(两个装箱基本类型可以具有相同的值和不同的同一性)2.基本类型只有功能完备的值,而每个装箱基本转载 2017-12-04 14:31:02 · 177 阅读 · 0 评论 -
7.40 谨慎设计方法签名
基本原则:1.谨慎选择方法名称,应使用简单,一致的方法名称,可参考JAVA API相关方法 2.不要提供过多的方便方法,特别是对接口方法。如果不清楚此方法是否能带来便利,则不提供 3.避免使用过长的方法参数列表,解决方法包括:(1)把长参数列表的方法分为多个短参数的方法(2)创建帮助类用于传入多个参数,如下Java代码转载 2017-11-25 10:19:58 · 209 阅读 · 0 评论 -
第四十一条:慎用重载
重载:两同一不同 两同:两个方法在同一个类中 ,两个方法同名 一不同:两个方法的参数列表不同 假设有这样一个类 1 public class TestWhichMethodIsUsed { 2 3 public static void testMethod(List list) 4 { 5 Syste转载 2017-11-25 10:21:05 · 161 阅读 · 0 评论 -
第42条:慎用可变参数
Java 1.5增加可变参数方法,可变参数方法接受0个或者多个指定类型的参数。可变参数的机制通过先创建一个数组,数组的大小为在调用位置所传递的参数数量,然后将参数值传到数组中,最后将数组传递给方法。static int sum(int... args) { int sum=0; for(int arg : args) sum += arg;转载 2017-11-25 10:21:50 · 250 阅读 · 0 评论 -
返回零长度的数组或者集合,而不是null
> 第四十三条:返回零长度的数组或者集合,而不是null 如果一个方法的返回值类型是集合或者数组 ,如果在方法内部需要返回的集合或者数组是零长度的,也就是没有实际对象在里面,我们也应该放回一个零长度的数组或者集合,而不是返回null。如果返回了null,客户端程序员就要检测返回的是不是null,然后才能进行下一步操作,否则就会引发NullPointException。但转载 2017-11-26 10:22:29 · 547 阅读 · 0 评论 -
如果其他类型更适合,则尽量避免使用字符串
1.字符串不适合代替其他的值类型当一段数据从文件、网络、或者键盘设备,进入到程序之后,它通常以字符串的形式存在。有一种自然的倾向是让它继续保留这种形式,但是,只有当这段数据本质上确实是文本信息时,这种想法才是合理的。2.字符串不适合替代枚举类型枚举类型比字符串更加适合用来表示枚举类型的常量3.字符串不适合代替聚集类型如果一个实体有多个组件,用一个字符串来表示这个实体通常是不恰当转载 2017-11-27 22:30:00 · 492 阅读 · 0 评论 -
051:当心字符串连接的性能
由于String是不可变的,所以为连接n个字符串(+号拼接)而重复地使用字符串连接操作符,需要n的平方级的时间。如果for循环次数过多,在for里面进行String拼接,这个方法的执行时间就难以估算,为了获得可以接受的性能,请使用StringBuilder(或StringBuffer)替代String。示例证明:package item51;/** * 测试Sting进行拼接字符串的性转载 2017-11-27 22:30:56 · 215 阅读 · 0 评论 -
String,StringBuffer与StringBuilder的区别??
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常转载 2017-11-27 22:31:34 · 116 阅读 · 0 评论 -
effective java 34条 通过接口引用对象
List接口的2个实现ArrarList,VectorList sub1 =new ArrarList();//goodArrarList sub2 = new ArrarList ()//bad养成接口编程的习惯,会使程序有很高的灵活性,比如在List sub1 =new ArrarList()中,如果以后程序需要变化成Vector,可以直接写成List su转载 2017-11-27 22:32:01 · 155 阅读 · 0 评论 -
接口优于反射
接口优于反射写在前面:最近在做一个需求:要针对不同的度量模型来执行不同的方法,同时要让后面接手的开发同学用最少的代码、最简单的方式来复用并实现更多度量模型。该需求一方面学到了一个新的设计模式——模板方法设计模式。另外一方面还得到一个经验————接口优于反射。Effective Java的作者说接口优先于反射机制,这个之前就有看过,但是当时也没搞明白接口和反射能有啥联系,直到转载 2017-11-27 22:32:47 · 310 阅读 · 0 评论 -
一个简单的Java序列化的例子
简单来说序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,流的概念这里不用多说(就是I/O),我们可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间(注:要想将对象传输于网络必须进行流化)!在对对象流进行读写操作时会引发一些问题,而序列化机制正是用来解决这些问题的!如上所述,读写对象会有什么问题呢?比如:我要将对象写入一个磁盘文件而后再将其读出来会有什么问转载 2017-11-29 08:12:52 · 258 阅读 · 0 评论 -
058:对于可恢复的条件使用被检查的异常,对于程序错误使用运行时异常
对于可恢复的情况,使用受检的异常;对于程序错误,则使用运行时异常。运行时异常RuntimeException类及其子类都被称为运行时异常。受检异常被检查的异常,Exception类本身,以及Exception的子类中除了“运行时异常”之外的其他子类都属于被检查异常类型。两者区别:Java编译器会对受检异常进行检查,而对运行时异常不会检查。也就是说对于受检转载 2017-11-29 08:09:56 · 253 阅读 · 0 评论 -
只针对异常的情况才使用异常
先看两段代码// 基于异常的模式String t1[]={"11","22"};try{ int i=0; while(true){ System.out.println(t1[i]); i++; }}catch(ArrayIndexOutOfBoundsException e){ }//标准模式 for(String t:t1){ System.out.转载 2017-11-29 08:09:07 · 310 阅读 · 0 评论 -
使类和成员的可访问性最小化
首先需要理解修饰符的可访问性,如图区别设计良好的模块和设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节。设计良好的模块会隐藏所有的实现细节,把它的API于它的实现清晰地隔离开来。然后,模块之间通过它们的API进行通信,一个模块不需要知道其他模块的内部工作情况,这个概念称为信息隐藏或封装。使类和成员的可访问性最小化可以有效转载 2017-09-04 10:15:56 · 220 阅读 · 0 评论 -
第15条:使可变性最小化
1.什么是不可变类需要的所有参数必须在实例化的时候都传进去。对象中所有信息在对象的整个生命周期中都保持不变。2.使类不可变的原则不要提供任何修改对象状态的方法。保证类不会被继承。使所有的域都是final类型的。使所有的域都是私有类型的。确保对于任何可变组件的互斥性。 即,确保在该类的外部不会获取到该类中可变对象的引用。比如下面这个例子:public class MyObject{ private转载 2017-09-04 11:42:55 · 263 阅读 · 0 评论 -
接口优于抽象类
Java语言提供了两种机制,可以用来定义一个允许多个实现的类型:接口和抽象类。如果对它们的基本定义还不是很清楚请参考其它书籍。 接口和抽象类这二者比较起来,从特征来说,最明显的区别在于抽象类允许包含某些方法的实现,但是接口是不允许的。但是在使用方面还有一个更为突出的区别,就是抽象类是通过被子类继承来使用的;而接口是通过被实现来使用的。而Java是一种单继承机制的语言,所以就转载 2017-09-05 16:30:13 · 382 阅读 · 0 评论 -
考虑用静态工厂方法代替构造器
这是 Effective Java 的第一节的标题。本文更多的是摘译该节的内容。什么是静态工厂方法(static factory methods)static factory methods 翻译过来就是静态工厂方法。它并不是 GOF 提的设计模式中的一个设计模式。我们看下面的例子(摘自JDK 1.7)。public final class Boolean implemen转载 2017-08-28 21:33:25 · 214 阅读 · 0 评论 -
遇到多个构造器参数时考虑用构造器
遇到多个构造器参数时要考虑用构建器javaeffective java创建和销毁对象1. 构建器是什么?2. 为什么使用构建器?2.1 参数的限制2.2 重叠构造器2.3 JavaBeans模式2.3.1 创建JavaBeans模式2.3.2 JavaBeans模式的劣势2.4 构建器3 总结1.转载 2017-08-28 22:40:08 · 261 阅读 · 0 评论 -
用私有构造器或者枚举来强化Singleton属性
在1.5版本之前可以两种实现Singleton的方法,但是都要把构造器保存为私有的。1、公有静态成员是个final域 // Singleton with public final field - Page 17 public class Elvis { public static final Elvis INSTANCE =转载 2017-08-29 08:25:34 · 664 阅读 · 2 评论 -
通过私有构造器强化不可实例化的能力
一、背景对于有些工具类如Java.lang.Math、java.util.Arrays等,它们只包含静态方法和静态域字段,对于这样的类实例化没有什么任何意义。但在实际使用中,如果不加任何特殊处理,这样的类还是可以像其他类一样可以被实例化。二、处理办法将构造函数设置为private,这样外部类无法实例化该类,同时在这个私有的构造函数中直接抛出异常,从而避免在类的内转载 2017-08-29 16:34:49 · 249 阅读 · 0 评论 -
消除过期的对象引用的理解
什么是过期的对象引用?我们通过简单的栈实现来引入过期的对象引用。public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack(){转载 2017-08-29 20:54:44 · 1486 阅读 · 3 评论 -
避免使用终结方法
一. finalize()基本概念所谓的终结方法其实是指finalize()。终结方法finalizer通常是不可预测的,也是很危险的。一般情况下是不必要的。使用终结方法会导致行为不稳定,降低性能,以及可移植性问题。根据经验,应避免使用终结方法。二、finalize()的执行过程当对象不可达时,GC会判断该对象是否重写了finalize()方法,如没有重写则直接将其回收,否则,若对象未转载 2017-08-29 21:37:27 · 850 阅读 · 0 评论 -
Java中equals()与hashCode()方法详解
转自:点击打开链接一.equals()方法详解 equals()方法在object类中定义如下: Java代码 public boolean equals(Object obj) { return (this == obj); } 很明显是对两个对象的地址值进行的比较(即比较引用是否相同)。但是我转载 2017-08-30 14:38:26 · 169 阅读 · 0 评论 -
始终要覆盖toString
来自:点击打开链接我们都知道Java书籍有四大名著,其中 Effective Java可以说是高手进阶必看的,作者 Joshua Bloch是Google的首席Java架构师,如果把 James Gosling称为Java之父,那么Joshua Bloch就像是Java之母,是他把Java养育成人。之前曾有人讨论过Google有很多编码规范,为什么唯独没有Java版的问题,最终转载 2017-08-30 17:30:22 · 435 阅读 · 0 评论 -
第十一条:谨慎地覆盖clone方法
这一条告诉我们,clone接口在定义时就没有指明一个类在实现时应该承担哪些责任,所以我想这个接口如果不是当初设计不良,就是后来的实现与当初设计偏离的。clone方法设想提供一种不需要构造器就可以创建对象的方法。它方法要求x.clone()!=x, 且x.clone().getClass()==x.getClass(),且通x.clone().equals(x), 这些规定很弱。比如x.cl转载 2017-08-31 17:30:27 · 631 阅读 · 0 评论 -
第一条:考虑用静态工厂方法代替构造器-----静态工厂方法讲解
静态工厂方法讲解 创建类的实例的最常见的方式是用new语句调用类的构造方法。在这种情况下,程序可以创建类的任意多个实例,每执行一条new语句,都会导致Java虚拟机的堆区中产生一个新的对象。假如类需要进一步封装创建自身实例的细节,并且控制自身实例的数目,那么可以提供静态工厂方法。 例如Class实例是Java虚拟机在加载一个类时自动创建的,程序无法用new语转载 2017-02-24 17:50:58 · 238 阅读 · 0 评论