手记

JAVA优化建议(3)

1.避免instance of 非预期结果
(1)instance of 只能用于对象的判断,不能用于基本类型的判断
eg:

boolean a = 'A' instanceof Character;

就会编译报错

(2)若左边操作数为null,结果就直接返回false,强转也为false
(3)编译器会检查 左边是否能转换成右边的class类型,如果不能转换则直接报错,如果不能确定类型,则通过编译,具体看运行时定。
eg:

 boolean a = new Date() instanceof String;

就会编译报错
2.利用偶判断不用奇判断
首先一个现象:

int i = -1%2;
System.out.println(i);

输出的为:-1
所以 一个数%2==1不能判断是否是奇数
原因%底层是这样的
//dividend被除数,divsor除数

 public static int remainder(int dividend, int divisor) {
        return dividend - dividend / divisor * divisor;
    }

3.注意边界,避免不必要的bug
eg1:

public class testInstanceOf {
    public static final int LIGHT_SPEED = 30 * 1000 * 10000;

    public static void main(String[] args) {
        System.out.println(LIGHT_SPEED);
        long distance = LIGHT_SPEED * 60 * 8;
        System.out.println(distance);     
    }
  }

输出distance:-2028888064
原因是LIGHT_SPEED*60时,数据类型为int,超出范围导致
改进:

long distance = LIGHT_SPEED * 60L * 8;

会自动转化为long
但是本身很大的数,可以直接声明long以防止超出范围,避免不必要的bug

public static final long LIGHT_SPEED = 30 * 1000 * 10000;

eg2:
情景:应经拥有的东西加要买的的东西不能超过200
但是如果已经购买了很大的

 int hasProduct = 2147483647;
       int buyProduct = 20;
       if((hasProduct+buyProduct) > 2000){
           System.out.println("你购买数量已经超过2000,不能继续购买");
       }else {
           System.out.println("你已经该买了: "+(hasProduct+buyProduct));
       }

打印:你已经该买了: -2147483629
依旧是超过范围,所以导致不必要的bug

4.谨慎包装类==比较大小

Integer a = 100;
Integer b = 100;
Integer i = 1000;
Integer j = 1000;
Integer m = new Integer(100);
Integer n = new Integer(100);
System.out.println("a==b " + (a == b));
System.out.println("i==j " + (i == j));
System.out.println("m==n " + (m == n));
System.out.println("m>n " + (m > n));
System.out.println("m<n " + (m < n));

输出:
a == b true
i == j false
mn false
m>n false
m<n false
ab 为ture,但是i==j为false,是因为查看Integer.java类,会发现有一个内部私有类,IntegerCache.java,它缓存了从-128到127之间的所有的整数对象。
如果在这个区间内,他就会把变量当做一个变量,放到内存中;但如果不在这个范围内,就会去new一个Integer对象。
源码如下:

public static Integer valueOf(int i) {
        assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

m==n 比较对象所以为false
m>n,m<n会自动拆箱比较,所以也为false
比较Integer的值,比较靠谱的是通过Integer.intValue()这样出来的就是int值,就可以直接比较了,或者equals()比较。

0人推荐
随时随地看视频
慕课网APP