现在的位置: 首页 > 综合 > 正文

java优化-表达式、关键字、语句

2014年02月07日 ⁄ 综合 ⁄ 共 3474字 ⁄ 字号 评论关闭

一、表达式、关键字、语句是任何一门程序的基础,也是最简单的,但是也是相对来说最容易出错的,稍有不慎,就会产生程序上的错误,或者出现性能上的问题。

Java中语言表达式分为2种,一元操作符和二元操作符,关于运算的顺序,我觉得没有必要记,也没有必要讨论,只需要加上()即可。简单明了。

二、字符串的比较,如果不经过特殊处理,比较字符串用“==”时比较的栈中的指向对象的地址,用equals是比较的对象内容。但是在某些场合不能使用equals时,可以使用字符串驻留的方式,主要使用String方法中的intern方法,JDK中的说明是:

     返回字符串对象的规范化表示形式。 一个初始为空的字符串池,它由类 String 私有地维护。当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。

     它遵循以下规则:对于任意两个字符串 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true

     它的效率要比equals的效率高的多。

看以下例子:

	public static void main(String[] args) {
		String str = new String("wpjava");
		if(str == "wpjava") {
			System.out.println("true");
		} else {
			System.out.println("false");
		}
		
		//做字符串驻留处理
		str = str.intern();
		if(str == "wpjava") {
			System.out.println("true");
		} else {
			System.out.println("false");
		}
	}

打印结果:

false

True

看以下例子:

String str1 = "java";

String str2 = "java";

if(str1 == str2) {

System.out.println("true");

} else {

System.out.println("false");

}

打印结果是true

String这么声明,是将字符串存放到一个单独的内存区域,而且这个这样声明的字符串都是不可变的,都是可以重复利用的,当发现有字符串“java”时,就用之前的,不在重新创建,JVM这样做无疑是加快了程序运行的效率,这只是单个字符串处理的时候,当字符串相加的时候JVM会转换成StringBuilder来相加,字符串相加用StringBuilder

二、static关键字

静态代码块,有时候为了引用一个类时需要做一些必要的初始化的操作,这个时候可以使用静态代码块。比如读一些资源文件,等等,可以设计一个布尔型的变量,在读取之前检检测一下,防止重复读取。

静态变量的引用规则

1、可以在非静态变量中引用静态变量

2、静态变量中不可以引用非静态变量

3、可以在静态方法中创建非静态变量

四、super超类

超类是引用父类对象,在这里要注意,当在构造方法中使用时必须要放到构造方法的第一行。在普通方法中没有特殊要求。

五、final最终的

final声明变量不可改变,声明方法不可以被重写,声明类不可以被继承。在编写程序中一些公共的类和方法最好声明为final,这样可以加快程序的运行效率,查看了一些资料上,都是这么说的,可是自己编写的测试程序感觉差不多。大家感性趣可以自己测试,不过可以肯定的是,内联的代码,肯定要比调用方法的效率要高,所以说不见得把方法拆分的越细就越好,看来什么都是两面的。大家可以把final去掉试下。

下面的例子:

        public final static int max(int a, int b) {
		return (a > b ? a : b);
	}
	
	public static void main(String[] args) {
		int n = 1000000000;
		int a = 12;
		int b = 10;
		int c = 0;
		long l1 = System.currentTimeMillis();
		for(int i=0; i<n; i++) {
			c = max(a, b);
		}
		long l2 = System.currentTimeMillis();
		System.out.println("调用方法时间差是:" + (l2 - l1));
		
		long l3 = System.currentTimeMillis();
		for(int i=0; i<n; i++) {
			c = a > b ? a : b;
		}
		long l4 = System.currentTimeMillis();
		System.out.println("使用内联函数时间差是:" + (l4 - l3));
	}

 六、synchronized同步

   七、instanceof实类识别

   八、if判断语句

   在说些if的时候注意不要把==误写为=,还有避免以下写法:

isTrue = false;

……

if(isTrue) {

……

}else {

……

}

     

     九、循环语句

     For循环的注意事项

     不要for循环中修改变量的值,放置循环失控,以下例子就陷入死循环。无法跳出循环

     for(int i=0; i<m; i++) {

……

m++;

……

     }

 for(int i=0; i<m; i++) {

……

i--;

……

     }

while循环和do while循环,主要注意不要进入死循环。

使用循环的几点建议:

1、当做数组拷贝时,采用System.arraycopy()方法要比使用循环来逐个拷贝效率快的多。

2、尽量避免在循环体中避免调用方法,因为方法的调用是比较昂贵的,可以在循环外把方法的赋值。

3、最好避免在循环体内存取数组元素,比较好的方法是在循环体内采用临时变量,在循环体外改变数组的值。这是因为在循环体内使用变量比使用数组元素快的多。

4、尽量使用0最为终结变量的值。以便提高效率。看以下例子:

      public static void testO() {
		int[] num = new int[10000000];
		int count = num.length;
		long l1 = System.currentTimeMillis();
		for(int i=0; i<count; i++) {
			int j = num[i];
		}
		long l2 = System.currentTimeMillis();
		System.out.println("不是用0时间差是:" + (l2 - l1));
		
		long l3 = System.currentTimeMillis();
		for(int i=count-1; i<=0; i--) {
			int j = num[i];
		}
		long l4 = System.currentTimeMillis();
		System.out.println("使用0时间差是:" + (l4 - l3));
	}

运行结果是:

    不是用0时间差是:16

使用0时间差是:0

可见使用第二种循环时间差几乎为0,所以在循环运用的时候要注意。

1、避免在做最终条件比较的时采用方法返回值的方式进行判断,这样做增大系统的开销,降低系统性能。

例如:

……

While(isTrue()){

……

}

……

应该该为:

……

Boolean isTrue = isTrue();

While(isTrue){

……

}

……

2、避免在循环体中使用try catch

while(isTrue) {

try {

} catch(Exception e) {

e.printStackTrace();

}

}

正确的写法是把trycatch放到外面

try {

while(isTrue) {

}

} catch(Exception e) {

e.printStackTrace();

}

3、在多层循环中尽量把最长的循环放到最内层,最短的循环放到最外层,以减少循环层间的切换次数。

4、如否循环体内有if-else判断,并且循环次数非常大,可以把if-else放到外面,减少判断的次数,以便提高性能。

for(int i=1000000; i<=0; i++) {

if(isTrue){

doThis();

}else {

doThat();

}

}

改为:

if(isTrue){

for(int i=1000000; i<=0; i++) {

doThis();

}

}else {

for(int i=1000000; i<=0; i++) {

doThat();

}

}

抱歉!评论已关闭.