[size=large][color=red][b]1、使用StringBuilder[/b][/color][/size]
一般来说,使用 StringBuilder 的效果要优于使用 + 操作符。如果可能的话请在需要跨多个方法传递引用的情况下选择 StringBuilder,因为 String 要消耗额外的资源。JOOQ在生成复杂的SQL语句便使用了这样的方式。在整个抽象语法树(AST Abstract Syntax Tree)SQL传递过程中仅使用了一个 StringBuilder 。

[color=blue][b]更加悲剧的是,如果你仍在使用 StringBuffer 的话,那么用 StringBuilder 代替 StringBuffer 吧,毕竟需要同步字符串的情况真的不多。[/b][/color]

[size=x-large][color=red][b]2、不要使用iterator()方法[/b][/color][/size]
这条建议不适用于一般的场合,仅适用于在 N.O.P.E 分支深处的场景。尽管如此也应该有所了解。Java 5格式的循环写法非常的方便,以至于我们可以忘记内部的循环方法,比如:

for (String value : strings) {
    // Do something useful here
}



当每次代码运行到这个循环时,如果 strings 变量是一个 Iterable 的话,代码将会自动创建一个Iterator 的实例。如果使用的是 ArrayList 的话,虚拟机会自动在堆上为对象分配3个整数类型大小的内存。


private class Itr implements Iterator<E> {
    int cursor;
    int lastRet = -1;
    int expectedModCount = modCount;
    // ...



也可以用下面等价的循环方式来替代上面的 for 循环,仅仅是在栈上“浪费”了区区一个整形,相当划算。


for (int i = 0; i < size; i++) {
    String value : strings.get(i);
    // Do something useful here
}




[b]如果循环中字符串的值是不怎么变化,也可用数组来实现循环。[/b]


for (String value : stringArray) {
    // Do something useful here
}




小结


无论是从易读写的角度来说,还是从API设计的角度来说迭代器、Iterable接口和 foreach 循环都是非常好用的。


但代价是,使用它们时是会额外在堆上为每个循环子创建一个对象。



[size=large][color=red][b]3、使用entrySet()[/b][/color][/size]


当我们想遍历一个用键值对形式保存的 Map 时,必须要为下面的代码找到一个很好的理由:


for (K key : map.keySet()) {
    V value : map.get(key);
}



更不用说下面的写法:


for (Entry<K, V> entry : map.entrySet()) {
    K key = entry.getKey();
    V value = entry.getValue();
}




在我们使用 N.O.P.E. 分支应该慎用map。因为很多看似时间复杂度为 O(1) 的访问操作其实是由一系列的操作组成的。而且访问本身也不是免费的。至少,如果不得不使用map的话,那么要用 entrySet() 方法去迭代,这样的话,我们要访问的就仅仅是Map.Entry的实例。



小结


[color=blue][b]在需要迭代键值对形式的Map时一定要用 entrySet() 方法。[/b][/color]



[size=large][color=red][b]4.for循环优化[/b][/color][/size]



[b]list.size()每次循环都会被执行一次,这无疑会影响程序的性能,所以应该将其放到循环外面,用一个变量来代替。[/b]



避免在for循环中捕捉异常



[color=blue][b]提取与循环无关的表达式避免在for循环中进行一些无用的运算[/b][/color]



[size=large][color=red][b]5.集合初始化时初始化个数[/b][/color][/size]



[size=medium][color=red][b]6.尽量实现对象重用 [/b][/color][/size]


系统要花时间生成对象,以后还需花时间对这些对象进行垃圾回收和处理。因此,生成过多的对象将会给程序的性能带来很大的影响。



[size=medium][color=red][b]7.将闲置的资源进行释放 [/b][/color][/size]


Java 编程过程中,进行数据库连接、I/O流操作时务必小心,在使用完毕后,及时关闭以释放资源。[b]因为对这些大对象的操作会造成系统大的开销,稍有不慎,会导致严重的后果。[/b]



[size=medium][color=red][b]8.StringTokenizer代替substring()和indexOf() [/b][/color][/size]


StringTokenizer是java中object类的一个子类,继承自 Enumeration( public interface Enumeration实现 Enumeration(列举) 接口的对象,它生成一系列元素,一次生成一个)接口。



[size=medium][color=red][b]9.System.arraycopy()实现数组值的拷贝 [/b][/color][/size]


两个数组间的复制建议不要使用循环,Java提供了一个数组拷贝的方法。



[size=medium][color=blue][b]10.尽量指定类、方法的final修饰符[/b][/color][/size]