java代码一些技巧

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)){
   ...
}

这么做主要是可以避免空指针异常;


参考的博客地址没记录… 如果原创作者看到请联系我~

后面遇到一些优化技巧会持续更新~【如果还记得的话】

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值