优雅java代码效率提高的习惯(一)

标签: java 代码 习惯 | 发表时间:2015-04-01 23:46 | 作者:wws199304
出处:http://blog.csdn.net

这篇文章将介绍java中提高效率的一些方法。

1.循环条件中的复杂表达式应该独立出来

在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。

例子: 

import java.util.vector;
class cel {
    void method (vector vector) {
        for (int i = 0; i < vector.size (); i++)  // violation
            ; // ...
    }
}

更正:

class cel_fixed {
    void method (vector vector) {
        int size = vector.size ()
        for (int i = 0; i < size; i++)
            ; // ...
    }
}

2.使用'system.arraycopy ()'代替通过来循环复制数组 

'system.arraycopy ()' 要比通过循环来复制数组快的多。        
例子: 

public class irb
{
    void method () {
        int[] array1 = new int [100];
        for (int i = 0; i < array1.length; i++) {
            array1 [i] = i;
        }
        int[] array2 = new int [100];
        for (int i = 0; i < array2.length; i++) {
            array2 [i] = array1 [i];                 // violation
        }
    }
}
   
更正: 
public class irb
{
    void method () {
        int[] array1 = new int [100];
        for (int i = 0; i < array1.length; i++) {
            array1 [i] = i;
        }
        int[] array2 = new int [100];
        system.arraycopy(array1, 0, array2, 0, 100);
    }
}

3. 使用移位操作来代替'a / b'操作,使用移位操作代替'a * b' 

例子: 

public class sdiv {
    public static final int num = 16;
    public void calculate(int a) {
        int div = a / 4;            // should be replaced with "a >> 2".
        int div2 = a / 8;         // should be replaced with "a >> 3".
        int temp = a / 3;
    }
}

更正: 
public class sdiv {
    public static final int num = 16;
    public void calculate(int a) {
        int div = a >> 2;  
        int div2 = a >> 3;
        int temp = a / 3;       // 不能转换成位移操作
    }
}
类似的,a*4,a*8可以用int mul = a << 2;    int mul2 = a << 3;代替,还有取余运算a=a%8可以用a=a&7代替。但是要权衡可读性问题。除法是整数运算中效率最低的,应该尽量避免。这里补充下&运算的原理,如:

int a=129;
int b=128;
System.out.println("a 和b 与的结果是:"+(a&b));

“a”的值是129,转换成二进制就是10000001,而“b”的值是128,转换成二进制就是10000000。根据与运算符的运算规律,只有两个位都是1,结果才是1,可以知道结果就是10000000,即128。


4. 对于boolean值,避免不必要的等式判断
将一个boolean值与一个true比较是一个恒等操作(直接返回该boolean变量的值). 移走对于boolean的不必要操作至少会带来2个好处: 
1)代码执行的更快 (生成的字节码少了5个字节); 
2)代码也会更加干净 。 

例子:

public class ueq
{
    boolean method (string string) {
        return string.endswith ("a") == true;   // violation
    }
}

更正: 
class ueq_fixed
{
    boolean method (string string) {
        return string.endswith ("a");
    }
}

5. 合理使用string,stringBuffer和stringBuilder

(1).如果要操作少量的数据用 = String
(2).单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
(3).多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

通过StringBuffer的构造函数来设定他的初始化容量,可以明显提升性能。 

6. 不要在循环体中实例化变量

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

import java.util.vector;
public class loop {
    void method (vector v) {
        for (int i=0;i < v.size();i++) {
            object o = new object();
            o = v.elementat(i);
        }
    }
}
        
更正:         
在循环体外定义变量,并反复使用         

import java.util.vector;
public class loop {
    void method (vector v) {
        object o;
        for (int i=0;i<v.size();i++) {
            o = v.elementat(i);
        }
    }
}

7. 在java+Oracle的应用系统开发中,java中内嵌的SQL语言应尽量使用大写形式,以减少Oracle解析器的解析负担。 

8. array 数组效率最高,但容量固定,无法动态改变,ArrayList容量可以动态增长,但牺牲了效率。 

9.不要使用 i % 2 == 1 来判断是否是奇数,因为i为负奇数时不成立,请使用 i % 2 != 0 来判断是否是奇数,或使用 高效式 (i & 1) != 0来判断。(让我想起了今年腾讯的笔试题)

10.货币单位计算时应该用最小单位,因为小数在java中是无法精确表示的,如:System.out.println(2.00 -1.10);//0.8999999999999999

11. int类型的溢出

我们计算一天中的微秒数: 
long microsPerDay = 24 * 60 * 60 * 1000 * 1000;// 正确结果应为:86400000000
System.out.println(microsPerDay);// 实际上为:500654080
问题在于计算过程中溢出了。这个计算式完全是以int运算来执行的,并且只有在运算完成之后,其结果才被提升为long,而此时已经太迟:计算已经溢出。 
解决方法使计算表达式的第一个因子明确为long型,这样可以强制表达式中所有的后续计算都用long运算来完成,这样结果就不会溢出: 
long microsPerDay = 24L * 60 * 60 * 1000 * 1000;

12. 尽量使用final修饰符

带有final修饰符的类是不可派生的。在JAVA核心API中,有许多应用final的例子,例如 java.lang.String。为String类指定final防止了使用者覆盖length()方法。另外,如果一个类是final的,则该类所有方法都是final的。java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高 50%。 

13. 用x++,x+=1代替x=x+1能提高效率

14.条件判断时将可能性大的放在前面

15. 出于安全考虑,判断语句应该将变量作为比较的对象

如if(a==3)代替为if(3==a)

16. 冒泡排序的时候设置一个boolean类型的交换标记可以提高速度(排序好不用再遍历)

例子:

package com.wws.yy;

import java.util.Random;

public class BubbleSortClient {
	
	public static void main(String[] args) {
		
		//构造数据
		int[] arr = constructDataArray(15);
		System.out.println("---------排序前-----------");
		printArrayData(arr);
		//冒泡排序
		bubbleSort2(arr);
		System.out.println("---------排序后-----------");
		printArrayData(arr);
	}
	
	//构造数据
	public static int[] constructDataArray(int length){
		int[] arr = new int[length];
		Random random = new Random();
		for(int i=0;i<length;i++){
			arr[i] = random.nextInt(length);
		}
		return arr;
	}
	
	/**
	 * 冒泡排序方法----第一种方法
	 * @param arr
	 */
	public static  int[] bubbleSort(int[] arr){
		for(int i=0; i<arr.length;i++){
			for(int j=i+1;j<arr.length;j++){
				if(arr[i] > arr[j]){
					//交换数据
					int temp = arr[i];
					arr[i] = arr[j];
					arr[j] = temp;
				}
			}
		}
		return arr;
	}
	
	/**
	 * 冒泡排序方法----第二种方法
	 * @param arr
	 */
	public static int[] bubbleSort2(int[] arr){
		for(int i=0;i<arr.length;i++){
			for(int j=0;j<arr.length-1-i;j++){
				if(arr[j] > arr[j+1]){
					//数据交换
					int temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
				}
			}
		}
		return arr;
	}
	
	//打印数据
	public static void printArrayData(int[] arr){
		for(int d :arr){
			System.out.print(d + "   ");
		}
		System.out.println();
	}
}

优化后:

import java.util.Random;

public class BubbleSortClient {
	
	public static void main(String[] args) {
		
		//构造数据
		int[] arr = constructDataArray(15);
		System.out.println("---------排序前-----------");
		printArrayData(arr);
		//冒泡排序
		bubbleSort4(arr);
		System.out.println("---------排序后-----------");
		printArrayData(arr);
	}
	
	//构造数据
	public static int[] constructDataArray(int length){
		int[] arr = new int[length];
		Random random = new Random();
		for(int i=0;i<length;i++){
			arr[i] = random.nextInt(length);
		}
		return arr;
	}
	
	/**
	 * 引入标志位,默认为true
	 * 如果前后数据进行了交换,则为true,否则为false。如果没有数据交换,则排序完成。
	 * @param arr
	 */
	public static int[] bubbleSort4(int[] arr){
		boolean flag = true;
		int n = arr.length;
		while(flag){
			flag = false;
			for(int j=0;j<n-1;j++){
				if(arr[j] >arr[j+1]){
					//数据交换
					int temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
					//设置标志位
					flag = true;
				}
			}
			n--;
		}
		return arr;
	}
	
	//打印数据
	public static void printArrayData(int[] arr){
		for(int d :arr){
			System.out.print(d + "   ");
		}
		System.out.println();
	}
}





作者:wws199304 发表于2015/4/1 15:46:06 原文链接
阅读:59 评论:0 查看评论

相关 [java 代码 习惯] 推荐:

优雅java代码效率提高的习惯(一)

- - CSDN博客编程语言推荐文章
这篇文章将介绍java中提高效率的一些方法. 1.循环条件中的复杂表达式应该独立出来. 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 2.使用'system.arraycopy ()'代替通过来循环复制数组 . 'system.arraycopy ()' 要比通过循环来复制数组快的多.

Java代码优化

- - ImportNew
2016年3月修改,结合自己的工作和平时学习的体验重新谈一下为什么要进行代码优化. 在修改之前,我的说法是这样的:. 就像鲸鱼吃虾米一样,也许吃一个两个虾米对于鲸鱼来说作用不大,但是吃的虾米多了,鲸鱼自然饱了. 代码优化一样,也许一个两个的优化,对于提升代码的运行效率意义不大,但是只要处处都能注意代码优化,总体来说对于提升代码的运行效率就很有用了.

java代码开发规范

- - BlogJava_首页
格式规范:                                                                      .       1、TAB空格的数量. 编辑器上的TAB空格数量统一取值为4.       2、换行, 每行120字符.       3、if语句的嵌套层数3层以内   .

Java 代码性能优化

- - IT瘾-geek
代码 优化,一个很重要的课题. 可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢. 这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗. 没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了. 代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的.

2011年度最牛逼java代码

- sunseesiu - ITeye论坛最新讨论
作者: 5172306 . 声明: 本文系ITeye网站发布的原创文章,未经作者书面许可,严禁任何网站转载本文,否则必将追究法律责任. 已有 16 人发表回复,猛击->>这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

Java代码编写的30条建议

- - inJava
(1) 类名首字母应该大写. 字段、方法以及对象(句柄)的首字母应小写. 对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母. 若在定义中出现了常数初始化字符,则大写static final基本类型标识符中的所有字母. 这样便可标志出它们属于编译期的常数. Java包(Package)属于一种特殊情况:它们全都是小写字母,即便中间的单词亦是如此.

编写高质量的Java代码

- - 研发管理 - ITeye博客
Java 开发通用方法和准则. 不要在变量和常量出现易混淆字母:int i=1l;. 三元操作符的值类型务必保持一致;. 避免带有变长参数的方法重载:Java 5 引入了变长参数,varags, 用…表示,变长参数必须是最后一个参数,一个方法不能有多个变长参数;. 别让null和空值影响到变长方法,主要出现在在变长方法的重载;.

如何写出更好的Java代码

- - Java译站
Java是最流行的编程语言之一,但似乎并没有人喜欢使用它. 好吧,实际上Java是一门还不错的编程语言,由于最近Java 8发布了,我决定来编辑一个如何能更好地使用Java的列表,这里面包括一些库,实践技巧以及工具. 这篇文章在 GitHub上也有. 你可以随时在上面贡献或者添加你自己的Java使用技巧或者最佳实践.

Matlab中调用第三方Java代码

- - ITeye博客
在Java中采用Matlab JA Builder可以实现调用m文件,采用这样的方式,可在Matlab的M文件中,直接调用Java类. 这种方式可以表示为Java--> Matlab( m, Java),即整个程序由Java启动. 那如何使用Matlab直接调用Java的方式. 错误的方法:网上有些说将jar、class放在Matlab的Search路径中.

JAVA代码编写的30条建议

- - Java - 编程语言 - ITeye博客
今天和大家谈论到的是关于Java代码编码方面的一些建议. 这里整理到JAVA代码编写的30条建议:. 字段、方法以及对象(句柄)的首字母应小写. 对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母. 若在定义中出现了常数初始化字符,则大写static final基本类型标识符中的所有字母.