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()比较。