枚举、泛型、可变参数、注解、基本类型自动装箱拆箱、for循环增强
参考资料:
http://wenku.baidu.com/view/bfedeab269dc5022aaea001c.html###
http://www.cnblogs.com/kakaku/articles/1317563.html
设计模式都是由这些设计原则演变而来,所以只要掌握了这些原则,那设计模式也就不难理解,在日常工作中也就不自觉地会应用起来。
参考资料:http://wenku.baidu.com/view/9295d4c1aa00b52acfc7ca64.html
单一职责原则(SRP):一个类应该只有一个发生变化的原因。
开放封闭原则(OCP):软件实体应该对扩展开放,对修改关闭。
Liskov替换原则(LSP):子类型(subtype)必须能够替换掉它的基类型(base type)。
依赖倒置原则(DIP):
a. 高层模块不应该依赖于低层模块。二者都应该依赖于抽象。
b.抽象不应该依赖于细节。细节应该依赖于抽象。
接口隔离原则(ISP):不应该强迫客户程序依赖并未使用的方法。
DRY:Don’t repeat yourself Principle。通过抽取公共部分放置在一个地方避免代码重复。
封装变化 (Encapsulate what varies)。
面向接口编程而不是实现(Code to an interface rather than to an implementation)。
优先使用组合而非继承(Favour Composition Over Inheritance)。
1. 避免使用finalize方法
该方法是Java对C++程序员惯用的析构函数的妥协,对于资源的释放应该放在finally{}块中进行。
2. 避免创建不必要的对象
String s = new String(“string”); // 创建一个对象
String s = “string”; // 放入字符串常量池,其它地方直接引用常量池
优先使用静态工厂方法,如Boolean.valueOf(String),不要使用new Boolean(String)
进行计算时,优先使用基本类型(如:long)而不是装箱基本类型(如:Long),避免无意识的自动装箱。
在某些场景,使用包装类型会使程序更加清晰、简洁,以及某些特殊用途比如基本类型不能为null。通常JVM对于小对象的创建于销毁代价较低,但是如果是多次复用(比如1个1000次的循环),或者比较消耗资源的对象(数据库连接)应尽量重用,比如在循环外部创建对象避免循环内部多次创建,建立数据库连接池重用对象。
3. 警惕内存泄露
产生原因:
a.过期引用
如果类自己管理内存,程序员就应该警惕内存泄露问题。一旦元素被释放掉,则该元素中包含的任何对象引用都应该被清空,但并不是说所有用完的对象都要来一句obj = null。
b.缓存
应该设置缓存的有效期,使用后台线程定时删除过期的项。
c.监听器和其它回调
内存泄露通常很难预测,除非非常有经验,所以往往我们都是在运营阶段才去注意内存泄露,通常采用Heap剖析工具(Heap Profiler)检测。
覆盖equals方法
诀窍:
a.使用“==”操作符检查“参数是否为这个对象的引用”
b.使用instanceof操作符检查“参数是否为正确的类型”
c.把参数转换成正确的类型
d.对于关键字段,检查参数中的关键字段是否等同于被比较对象中的字段。
通用规定:
自反性(reflexive):a==a必返回true。
对称性(symmetric):如果a=b,那么b=a。
传递性(transitive):如果a=b,b=c,则a=c。
一致性(consistent):多次调用返回结果不变。
建议:
覆盖equals方法的同时,也必须覆盖hashCode方法。因为:相等的对象必须具有相等的hash code。HashMap的get方法,先判断hash值是否相等,再判断key是否为同一对象或者“相等”的对象。
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;