java

位置:IT落伍者 >> java >> 浏览文章

Java程序性能优化(3)


发布日期:2020年01月19日
 
Java程序性能优化(3)

十四对于boolean值避免不必要的等式判断

将一个boolean值与一个true比较是一个恆等操作(直接返回该boolean变量的值) 移走对于boolean的不必要操作至少会带来个好处

)代码执行的更快 (生成的字节码少了个字节)

)代码也会更加干净

例子

public class UEQ

{

boolean method (String string) {

return stringendsWith (a) == true; // Violation

}

}

更正

class UEQ_fixed

{

boolean method (String string) {

return stringendsWith (a);

}

}

十五对于常量字符串String 代替 StringBuffer

常量字符串并不需要动态改变长度

例子

public class USC {

String method () {

StringBuffer s = new StringBuffer (Hello);

String t = s + World!;

return t;

}

}

更正

把StringBuffer换成String如果确定这个String不会再变的话这将会减少运行开销提高性能

十六StringTokenizer 代替 indexOf()substring()

字符串的分析在很多应用中都是常见的使用indexOf()和substring()来分析字符串容易导致StringIndexOutOfBoundsException而使用StringTokenizer类来分析字符串则会容易一些效率也会高一些

例子

public class UST {

void parseString(String string) {

int index = ;

while ((index = stringindexOf( index)) != ) {

Systemoutprintln (stringsubstring(index stringlength()));

}

}

}

参考资料

Graig Larman Rhett Guthrie: Java Performance and Idiom Guide

Prentice Hall PTR ISBN: pp

十七使用条件操作符替代if (cond) return; else return; 结构

条件操作符更加的简捷

例子

public class IF {

public int method(boolean isDone) {

if (isDone) {

return ;

} else {

return ;

}

}

}

更正

public class IF {

public int method(boolean isDone) {

return (isDone ? : );

}

}

十八使用条件操作符代替if (cond) a = b; else a = c; 结构

例子

public class IFAS {

void method(boolean isTrue) {

if (isTrue) {

_value = ;

} else {

_value = ;

}

}

private int _value = ;

}

更正

public class IFAS {

void method(boolean isTrue) {

_value = (isTrue ? : ); // compact expression

}

private int _value = ;

}

十九不要在循环体中实例化变量

在循环体中实例化临时变量将会增加内存消耗

例子

import javautilVector;

public class LOOP {

void method (Vector v) {

for (int i=;i < vsize();i++) {

Object o = new Object();

o = velementAt(i);

}

}

}

更正

在循环体外定义变量并反复使用

import javautilVector;

public class LOOP {

void method (Vector v) {

Object o;

for (int i=;i<vsize();i++) {

o = velementAt(i);

}

}

}

二十确定 StringBuffer的容量

StringBuffer的构造器会创建一个默认大小(通常是)的字符数组在使用中如果超出这个大小就会重新分配内存创建一个更大的数组并将原先的数组复制过来再丢弃旧的数组在大多数情况下你可以在创建StringBuffer的时候指定大小这样就避免了在容量不够的时候自动增长以提高性能

例子

public class RSBC {

void method () {

StringBuffer buffer = new StringBuffer(); // violation

bufferappend (hello);

}

}

更正

为StringBuffer提供寝大小

public class RSBC {

void method () {

StringBuffer buffer = new StringBuffer(MAX);

bufferappend (hello);

}

private final int MAX = ;

}

参考资料

Dov Bulka Java Performance and Scalability Volume : ServerSide Programming

Techniques Addison Wesley ISBN: p

二十一尽可能的使用栈变量

如果一个变量需要经常访问那么你就需要考虑这个变量的作用域了static? local?还是实例变量?访问静态变量和实例变量将会比访问局部变量多耗费个时钟周期

例子

public class USV {

void getSum (int[] values) {

for (int i=; i < valuelength; i++) {

_sum += value[i]; // violation

}

}

void getSum (int[] values) {

for (int i=; i < valuelength; i++) {

_staticSum += value[i];

}

}

private int _sum;

private static int _staticSum;

}

更正

如果可能请使用局部变量作为你经常访问的变量

你可以按下面的方法来修改getSum()方法

void getSum (int[] values) {

int sum = _sum; // temporary local variable

for (int i=; i < valuelength; i++) {

sum += value[i];

}

_sum = sum;

}

参考资料

Peter Haggar: Practical Java Programming Language Guide

Addison Wesley pp

二十二不要总是使用取反操作符(!)

取反操作符(!)降低程序的可读性所以不要总是使用

例子

public class DUN {

boolean method (boolean a boolean b) {

if (!a)

return !a;

else

return !b;

}

}

更正

如果可能不要使用取反操作符(!)

二十三与一个接口 进行instanceof操作

基于接口的设计通常是件好事因为它允许有不同的实现而又保持灵活只要可能对一个对象进行instanceof操作以判断它是否某一接口要比是否某一个类要快

例子

public class INSOF {

private void method (Object o) {

if (o instanceof InterfaceBase) { } // better

if (o instanceof ClassBase) { } // worse

}

}

class ClassBase {}

interface InterfaceBase {}

               

上一篇:Java Swing中键盘的处理

下一篇:深入Java核心 Java内存分配原理精讲