学习资料《Java编码优化》和《编程那些事》的笔记

编程那些事

1、异常

1.1 捕获异常后,使用日志记录异常信息
try{
}catch(Exception e){
logger.error(e.getMessage(),e);
//或者使用logger.error(e);
…进行出错的处理,抛出异常或者…
}

1.2 在finally中对资源进行释放
在filally中关闭Connection或者流等。
FileReader=null;
try{
reader=new FileReader(new File(path));
}
finally{
if(reader!=null){
try{
reader.close();
}
catch(IOException e){
logger.error(”关闭文件流时出错”,e);
}
}
}

1.3 不要在finally中使用return和throw
return会导致finally中的return执行,导致返回值不准确。
throw导致原错误被转移,无法获知出错的真实原因。

2、Java基础类

2.1 使用BigDecimal进行精确计算
在遇到货币时应该使用BigDecimal进行存储。

2.2 使用BigDecimal.compareTo方法比较两个数
进行比较时使用BigDecimal.compareTo方法,而不是equals方法。

2.3 使用BigDecimal(String)进行构造
new BigDecimal(Double.toString(float));

2.4 排序使用实现Comparable接口来实现
MyObject implements Comparable<MyObject>
实现public int compareTo(MyObject mo)

MyObjectList<MyObject>
Collections.sort(MyObjectList);

2.5 无法使用实现Comparable接口时,考虑使用继承Comparator接口
在不方便修改原生类的时间使用此方法。
public class EmpComparator implements Comparator<MyObject>
实现public int compare(MyObject mo,MyObject anotherMo)
Collections.sort(MyObjectList,new EmpComparator());
Arrays.sort(MyObjectArray,new EmpComparator());

2.6 equals判断字符串相等
str=null||”".equals(str)

2.7 使用StringBuffer来拼接字符串
比+的性能提高很多
StringBuilder提高不少性能,他是非线程安全的。

2.8 编译器对常量字符串的拼接优化
String str=”a”+”b”;
不会产生多余变量。

2.9实现了java.io.Closeable接口的类要记住在finally中释放资源,否则可能导致资源无法,引起一连串的错误。

3、其他
3.1 循环过程中不变的量在进入循环之前进行计算
for(int i=0;j=list.size();i<j;i++)

3.2 通过接口引入对象
List list=new ArrayList(20)

3.3 利用JDK的内部异常对方法的入口参数进行有效性检查
NullPontException
IllegalArgumentException

3.4 返回0长度的集合而不是null
new ArrayList(0);
减少某些不必要的空指针判断。

3.5 该是什么型,就用什么类型,不要被String限制
Date,int,BigDecimal等

3.6 避免使用System.exit()退出
在多线程的环境下,将导致Web服务器的结束。

Java编码优化

注意以下方面:
设计风格
内存管理
核心类
类与接口
异常处理

1、设计风格
建议:
每一个文件、类、方法都要有注释和说明其含义和使用的规则。
一般一个java源文件(包括注释)不超过2000行。

每一节代码空一行,并有注释,方法间空一行。
某方法不再使用,可以加上@deprecated。

2、内存管理
我们都知道JAVA虚拟机(JVM)会负责回收垃圾对象,如果你完全依赖JAVA虚拟机,你编写的程序很可能不是最优的,因为无论多么优良的硬件配置都是有极限的。
什么是垃圾对象?
JVM如何回收垃圾对?
如何使用静态变量?
使用内存应注意哪些问题?

垃圾对象:
垃圾对象
当对象在JVM运行空间中无法通过根集合到达时,这个对象就被称为垃圾对象。

根集合
根集合是由类中的静态引用域与本地引用域组成。

JVM怎样回收垃圾对象呢?
JVM是根据内存区域和对象的状态进行垃圾回收的。

对象声明周期
1.创建阶段
2.应用阶段
3.不可视阶段
4.不可到达阶段
5.可收集阶段
6.终结阶段
7.释放阶段

静态变量只占一份内存空间,但不易被回收,要慎用。
在满足下面全部条件时尽量使用静态变量:
【1】变量包含的对象体积大。
【2】变量包含的对象生命周期长。
【3】变量包含的对象数据稳定。
【4】该类的所有对象实例都对该变量有共享需求。

Java内存优化经验
【1】不要提前创建对象。
【2】尽早释放无用对象的引用。
【3】如果经常用到图片,推荐使用软引用。
【4】注意集合数据类型,回收比较复杂。
【5】静态变量容易引起悬挂对象,慎用!
【6】尽量避免在构造器中创建、初始化大对象。
【7】尽量避免强制系统垃圾回收。

3、Java核心类

3.1散列表类
线程安全
线程安全:Vector,HashTable等。同步,效率低。
非线程安全:ArrayList,HashMap等。异步,效率高。

初始化容量
非必要时,避免设置列表初始化容量。
当列表容量很大,并容量可以预知时,最好设置初始化容量。
例如设置ArrayList初始化容量:list.ensureCapacity(1000000);

ArrayList与LinkedList的区别?
ArrayList与LinkedList的区别:
1.当制定位置插入数据时,LinkedList效率高;
2.遍历时,ArrayList效率高。

3.2字符串类
优化经验:
【1】用StringBuffer处理多个字符串连接。

【2】length()方法不要放到循环体中使用。

【3】循环使用charAt()不如先用toCharArray()转为字符数组。

【4】尽量避免字符类型与数字类型之间转换。

3.3数据流类
数据格式分类
【1】二进制流(InputStream,OutputStream)
【2】字符流(Reader,Writer)。

读写方式分类
【1】直接读写(慢)
【2】通过系统缓冲(快)
【3】通过自定制缓冲区(更快,但非常费内存)

通过压缩流处理压缩文件。
java.util.zip.ZipInputStream
java.util.zip.ZipOutputStream

4、类与接口
类与接口优化经验
类的构造器
【1】避免在构造器中实例化其他类。
【2】不要写返回值。
【3】避免对静态变量赋值。
内部类实例化要复杂和耗时,最好用非public具体类代替。
需要时推荐使用接口,提高系统性能和灵活程度。
使用原数据的包装类,比使用原数据低效。
最好把只初始化一次的变量放到构造器中一次性初始化。
implements接口列表中,最常用的最好放到后面。

5、Java异常处理
【1】慎用异常。异常对性能不利,因为抛出异常首先要创建一个新的对象。
【2】JAVA异常应该用于不可控错误的处理,不应该用来控制程序流程,流程尽量用while,if等处理。
【3】尽量减少try块中的代码量。
【4】在不是很影响代码健壮性的前提下,可以把几个try/catch块合成一个。
【5】在finally块中释放系统资源 。
【6】使用精确异常,避免使用超类Exception,可以提高系统效率 。