1.java浮点数精确运算陷阱:
System.out.println(2.0-1.1);
运算结果是:0.8999999999999999
如果需要精确运算,需要使用BigDecimal类进行运算:
BigDecimal a1 = new BigDecimal(Double.toString(2.0));
BigDecimal a2 = new BigDecimal(Double.toString(1.1));
System.out.println(a1.subtract(a2).doubleValue());
2.java自增自减陷阱
int j = 0;
for(int i=0;i<100;i++){
j = j++;
}
System.out.println("j="+j);
结果为:j=0
这是因为在JVM工作原理中,先执行j++后,再将j++之前的值赋给j,也就是j自加1后,再将0赋值给j,因此在这个代码中执行的结果是j=0。
3.java字符和字符串陷阱
System.out.println("a" + "b");
System.out.println('a' + 'b');
System.out.println("a" + 'b');
结果为:
ab
195
ab
原因很简单,字符间的操作是将ASNII码进行操作的。第三行将字符‘b’转换为“b”,然后将字符串拼接。
4.java return与try-finally陷阱
try{
return false;
}
finally{
return true;
}
结果为:true
这个很简单,在try的return前将会执行finally,finally有return,将会优先return。
try{
System.out.println("Hello!");
System.exit(0);
}
finally{
System.out.println("GoodBye!");
}
结果为:Hello!
结果很显而易见,因为遇到System.exit(0),finally将不会再执行。