1.
尽量指定类的final修饰符。带有final修饰符的类是不可派生的。如果指定一个类为final,
则该类所有的方法都是final。此举能够使性能平均提高50%。
2. 尽量重用对象。特别是String对象的使用中出现字符串连接情况时应用StringBuffer代替。
3. 尽量使用局部变量。调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack )中速度快。其他变量、实例变量等,都在堆(Heap)中创建,速度慢。
4. 不要重复初始化变量。默认情况下,调用类的构造函数时java会把变量初始化成确定的值, 所有对象设置成null,整数变量(byte、short、int、long)设置成0,float和double设置成 0.0,逻辑值设置成false。当一个类从另一个类派生时,这一点尤其应该注意,因为用new关 键词创建一个对象时,构造函数链中所有构造函数都会被调用。
5. 在java+Oracle的应用中系统开发中,java中内嵌的SQL语句尽量使用大写的形式,以减轻 Oracle解析器的解析负担。
6. Java编程编程过程中,进行数据库连接、I/O流操作时务必小心,在使用完毕后,及时关闭以 释放资源。
7. 由于JVM的其自身的GC机制,不需要程序开发者过多考虑,从一定程度上减轻了开发者负担, 但同时也遗漏了隐患。JVM回收垃圾的条件是:对象不再被应用;然而,JVM的GC并非十分的 机智,即时对象满足了垃圾回收的条件也不一定会被立即回收。所以建议在对象使用完毕后 ,手动设置成null。
8. 在使用同步机制时,尽量使用方法同步代替代码块同步。
9. 减少对变量的重复计算。
例如:
for(int i = 0; i < array.length; i++) {
…
}
应替换为:
for(int i = 0, len = array.length; i < len; i++) {
…
}
10. 尽量使用lazy loading的策略,在需要的时候才开始创建。
例如:
String str = "aa";
if(i == 1) {
list.add(str);
}
应替换为:
if(i == 1) {
String str = "aa";
list.add(str);
}
11. 慎用异常,异常对性能不利。抛出异常首先要创建一个对象。Throwable接口的构造函数调用 名为fillInStackTrace()的本地方法,fillInStackTrace()方法检查栈,收集调用跟踪信息 。只要有异常被抛出,VM就必须调整调用栈,因为在处理过程中创建了一个新的对象。异常 只能用于错误处理,不应该用来控制程序流程。
12. 不要再循环中使用Try/catch语句,应该把其放置在最外层。
13. StringBuffer的使用,StringBu表示可变的、可写的字符串。有三个构造方法。
new StringBuffer(); //默认分配16个字符的空间
new StringBuffer(int size); //分配size个字符的空间
new StringBuffer(String str); //分配16个字符+str.length()个字符空间
当StringBuffer达到最大容量是,它会将自身容量增加到当前2倍再加2,也就是(2*旧值+2) 。无论何时,只要只要StringBuffer达到最大容量,它就不得不创建一个新的字符数组,然 后重新将旧字符和新字符复制一遍——这也太昂贵了点。所以应给StringB设置一个合适的初 始化容量,这样会带来立竿见影的效果。
14. 合理使用Java类java.util.Vector。简单的说,一个Vector就是一个java.lang.Object实例 的数组。Vector与数组相似,它的元素可以通过整数形式的索引访问。但Vector类型的对象 在创建之后,对象的大小依元素的增加或者删除而定。Vector的初始存储能力是10个元素, 如果新元素加入是的存储能力不足,则以后存储能力每次加倍。Vector类就像StringBuffer 类一样,每次扩展存储能力时,所有的元素都要复制到新的存储空间中。
15. 当复制大量数据时,使用System.arraycopy()。
16. 代码重构:增强代码的可读性。
17. 不用new关键字创建类的实例。用new关键字创建类的实例时,构造函数链中的所有构造函数 都会被自动调用。但如果实现了Cloneable接口,我们就可以调用它的clone()方法。clone() 方法不会调用任何类的构造函数。
18. 乘法和除法
用位移操作代替乘法除法可以大大的提高性能。每左移一位等于乘2,右移一位等于除2.。但 是虽然位移操作速度快,但这使代码的教较难理解,所以最好加上注释。
19. 不要将数组声明为:public static final。
20. 讨论HashMap的遍历效率。
使用这种方法效率更高
Map<String, String[]> paramap = new HashMap<String, String[]>();
for(Entry<String, String[]> entry : paramap.entrySet()) {
String appid = entry.getKey();
String[] value = entry.getValue();
}
21. array(数组)和ArrayList的使用。array([]):最高效;但是其容量固定而且无法动态改变; ArrayList:容量可动态增长;但牺牲效率。
基于效率和类型的检验。应尽可能使用array,无法确定数组大小时,才使用ArrayList。
22. 尽量使用HashMap和ArrayList,除非必要,否则不推荐使用HashTable和Vector,后者由于使用 同步机制,而导致了性能的开销.
23. StringBuffer和StringBuilder的区别在于:java.lang.StringBuffer线程安全的可变字符序 列。一个类似于String的字符串缓冲区,但不能修改。StringBuilder与该类相比,通常应该 优先使用java.lang.StringBuilder类,因为它支持所有相同的操作,但由于它不执行同步, 所以速度更快。为了获得更好的性能,在构造StringBuffer和StringBuilder时应尽可能指定 它的容量。如果字符长度不超过16个字符就不用了.相同情况下StringBuilder比使用 StringBuffer仅能获得10%~15%左右的性能提升,但也冒多线程不安全的风险。除非你能确定 你的系统瓶颈在StringBuffer上,并且确定你的模块不会再运行在多线程模式下,否则还是 使用StringBuffer。
2. 尽量重用对象。特别是String对象的使用中出现字符串连接情况时应用StringBuffer代替。
3. 尽量使用局部变量。调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack )中速度快。其他变量、实例变量等,都在堆(Heap)中创建,速度慢。
4. 不要重复初始化变量。默认情况下,调用类的构造函数时java会把变量初始化成确定的值, 所有对象设置成null,整数变量(byte、short、int、long)设置成0,float和double设置成 0.0,逻辑值设置成false。当一个类从另一个类派生时,这一点尤其应该注意,因为用new关 键词创建一个对象时,构造函数链中所有构造函数都会被调用。
5. 在java+Oracle的应用中系统开发中,java中内嵌的SQL语句尽量使用大写的形式,以减轻 Oracle解析器的解析负担。
6. Java编程编程过程中,进行数据库连接、I/O流操作时务必小心,在使用完毕后,及时关闭以 释放资源。
7. 由于JVM的其自身的GC机制,不需要程序开发者过多考虑,从一定程度上减轻了开发者负担, 但同时也遗漏了隐患。JVM回收垃圾的条件是:对象不再被应用;然而,JVM的GC并非十分的 机智,即时对象满足了垃圾回收的条件也不一定会被立即回收。所以建议在对象使用完毕后 ,手动设置成null。
8. 在使用同步机制时,尽量使用方法同步代替代码块同步。
9. 减少对变量的重复计算。
例如:
for(int i = 0; i < array.length; i++) {
…
}
应替换为:
for(int i = 0, len = array.length; i < len; i++) {
…
}
10. 尽量使用lazy loading的策略,在需要的时候才开始创建。
例如:
String str = "aa";
if(i == 1) {
list.add(str);
}
应替换为:
if(i == 1) {
String str = "aa";
list.add(str);
}
11. 慎用异常,异常对性能不利。抛出异常首先要创建一个对象。Throwable接口的构造函数调用 名为fillInStackTrace()的本地方法,fillInStackTrace()方法检查栈,收集调用跟踪信息 。只要有异常被抛出,VM就必须调整调用栈,因为在处理过程中创建了一个新的对象。异常 只能用于错误处理,不应该用来控制程序流程。
12. 不要再循环中使用Try/catch语句,应该把其放置在最外层。
13. StringBuffer的使用,StringBu表示可变的、可写的字符串。有三个构造方法。
new StringBuffer(); //默认分配16个字符的空间
new StringBuffer(int size); //分配size个字符的空间
new StringBuffer(String str); //分配16个字符+str.length()个字符空间
当StringBuffer达到最大容量是,它会将自身容量增加到当前2倍再加2,也就是(2*旧值+2) 。无论何时,只要只要StringBuffer达到最大容量,它就不得不创建一个新的字符数组,然 后重新将旧字符和新字符复制一遍——这也太昂贵了点。所以应给StringB设置一个合适的初 始化容量,这样会带来立竿见影的效果。
14. 合理使用Java类java.util.Vector。简单的说,一个Vector就是一个java.lang.Object实例 的数组。Vector与数组相似,它的元素可以通过整数形式的索引访问。但Vector类型的对象 在创建之后,对象的大小依元素的增加或者删除而定。Vector的初始存储能力是10个元素, 如果新元素加入是的存储能力不足,则以后存储能力每次加倍。Vector类就像StringBuffer 类一样,每次扩展存储能力时,所有的元素都要复制到新的存储空间中。
15. 当复制大量数据时,使用System.arraycopy()。
16. 代码重构:增强代码的可读性。
17. 不用new关键字创建类的实例。用new关键字创建类的实例时,构造函数链中的所有构造函数 都会被自动调用。但如果实现了Cloneable接口,我们就可以调用它的clone()方法。clone() 方法不会调用任何类的构造函数。
18. 乘法和除法
用位移操作代替乘法除法可以大大的提高性能。每左移一位等于乘2,右移一位等于除2.。但 是虽然位移操作速度快,但这使代码的教较难理解,所以最好加上注释。
19. 不要将数组声明为:public static final。
20. 讨论HashMap的遍历效率。
使用这种方法效率更高
Map<String, String[]> paramap = new HashMap<String, String[]>();
for(Entry<String, String[]> entry : paramap.entrySet()) {
String appid = entry.getKey();
String[] value = entry.getValue();
}
21. array(数组)和ArrayList的使用。array([]):最高效;但是其容量固定而且无法动态改变; ArrayList:容量可动态增长;但牺牲效率。
基于效率和类型的检验。应尽可能使用array,无法确定数组大小时,才使用ArrayList。
22. 尽量使用HashMap和ArrayList,除非必要,否则不推荐使用HashTable和Vector,后者由于使用 同步机制,而导致了性能的开销.
23. StringBuffer和StringBuilder的区别在于:java.lang.StringBuffer线程安全的可变字符序 列。一个类似于String的字符串缓冲区,但不能修改。StringBuilder与该类相比,通常应该 优先使用java.lang.StringBuilder类,因为它支持所有相同的操作,但由于它不执行同步, 所以速度更快。为了获得更好的性能,在构造StringBuffer和StringBuilder时应尽可能指定 它的容量。如果字符长度不超过16个字符就不用了.相同情况下StringBuilder比使用 StringBuffer仅能获得10%~15%左右的性能提升,但也冒多线程不安全的风险。除非你能确定 你的系统瓶颈在StringBuffer上,并且确定你的模块不会再运行在多线程模式下,否则还是 使用StringBuffer。