1、尽量减少对变量的重复计算
明确一个概念,对方法的调用,即使方法中只有一句语句,也是有消耗的,包括创建栈帧、调用方法时保护现场、调用方法完毕时恢复现场等。所以例如下面的操作:
for (int i = 0; i < list.size(); i++){
...
}
建议替换为:
for (int i = 0, length = list.size(); i < length; i++){
...
}
2、乘法和除法使用移位操作
例如:
for (val = 0; val < 100000; val += 5){
a = val * 8;
b = val / 2;
}
用移位操作可以极大地提高性能,因为在计算机底层,对位的操作是最方便、最快的,因此建议修改为:
for (val = 0; val < 100000; val += 5){
a = val << 3;
b = val >> 1;
}
移位操作虽然快,但是可能会使代码不太好理解,因此最好加上相应的注释。
3、实现RandomAccess接口的集合比如ArrayList,应当使用最普通的for循环而不是foreach循环来遍历
这是JDK推荐给用户的。JDK API对于RandomAccess
接口的解释是:实现RandomAccess
接口用来表明其支持快速随机访问,此接口的主要目的是允许一般的算法更改其行为,从而将其应用到随机或连续访问列表时能提供良好的性能。实际经验表明,实现RandomAccess
接口的类实例,假如是随机访问的,使用普通for循环效率将高于使用foreach
循环;反过来,如果是顺序访问的,则使用Iterator
会效率更高。
foreach循环的底层实现原理就是迭代器 Iterator
,所以后半句”如果是顺序访问的,则使用Iterator会效率更高”的意思就是顺序访问的那些类实例,使用foreach循环去遍历效率更高;
可以使用类似如下的代码作判断:
if (list instanceof RandomAccess){
for (int i = 0, length = list.size(); i < length; i++){
...
}
}else{
Iterator<?> iterator = list.iterable();
while (iterator.hasNext()){
iterator.next()
}
}
4、把一个基本数据类型转为字符串,基本数据类型.toString()是最快的方式、String.valueOf(数据)次之、数据+"" 最慢
把一个基本数据类型转为字符串一般有三种方式,比如一个Integer类型数据i,可以使用i.toString()
、String.valueOf(i)
、i+""
三种方式,三种方式的效率如何,看一个测试:
public static void main(String[] args){
int loopTime = 50000;
Integer i = 0;
long startTime = System.currentTimeMillis();
for (int j = 0; j < loopTime; j++){
String str = String.valueOf(i);
}
System.out.println("String.valueOf():" + (System.currentTimeMillis() - startTime) + "ms");
startTime = System.currentTimeMillis();
for (int j = 0; j < loopTime; j++){
String str = i.toString();
}
System.out.println("Integer.toString():" + (System.currentTimeMillis() - startTime) + "ms");
startTime = System.currentTimeMillis();
for (int j = 0; j < loopTime; j++){
String str = i + "";
}
System.out.println("i + \"\":" + (System.currentTimeMillis() - startTime) + "ms");
}
运行结果为:
String.valueOf():4ms
Integer.toString():3ms
i + “”:9ms
所以以后遇到把一个基本数据类型转为String的时候,优先考虑使用toString()
方法。至于为什么:
- 1、
String.valueOf()
方法底层调用了Integer.toString()
方法,但是会在调用前做空判断; - 2、
Integer.toString()
方法就不说了,直接调用了; - 3、
i + ""
底层使用了StringBuilder
实现,先用append方法
拼接,再用toString()
方法获取字符串;
三者对比下来,明显是2最快、1次之、3最慢
5、字符串变量和字符串常量equals
的时候将字符串常量写在前面
这是一个比较常见的小技巧了,如果有以下代码:
String str = "123";
if (str.equals("123")) {
...
}
建议修改为:
String str = "123";
if ("123".equals(str)){
...
}
这么做主要是可以避免空指针异常;
参考的博客地址没记录… 如果原创作者看到请联系我~
后面遇到一些优化技巧会持续更新~【如果还记得的话】