Java中有意思的知识点你知道多少?

作者:不要哭啦

发布时间:2016-11-21T16:18:57

1.奇偶判断

不要使用 i % 2 == 1 来判断是否是奇数,因为i为负奇数时不成立,请使用 i % 2 != 0 来判断是否是奇数,或使用

高效式 (i & 1) != 0来判断。

2.小数精度计算

System.out.println(2.00 - 1.10 ); // 0.8999999999999999

解决方案1:

System.out.println(new  BigDecimal("2.0" ).subtract(new  BigDecimal("1.10" ))); // 0.9

一定要用BigDecimal(String)构造器,而千万不要用BigDecimal(double)来构造(也不能将float或double型转换成String再来使用BigDecimal(String) 来构造,因为在将float或double转换成String时精度已丢失)。

另外,如果要比较两个浮点数的大小,要使用BigDecimal的compareTo方法。 解决方案2:

System.out.println(200 - 110); // 90

3.int整数相乘溢出

final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000; // 正确结果应为:86400000000 实际结果为500654080

24 * 60 * 60 * 1000 这个时候是int类型,当再次乘以1000的时候就会超过int的最大范围-2147483648--2147483647,因此结果错误

解决方案:

final long MICROS_PER_DAY = 24L * 60 * 60 * 1000 * 1000; // 把int类型转换成Long计算就行了

4.三元表达式(?:)

char  x = 'X' ;
int  i = 0 ;
System.out.println(true  ? x : 0 );// X
System.out.println(false  ? i : x);// 88

1.如果第二个和第三个操作数具有相同的类型,那么它就是条件表达式的类型。 果一个操作的类型是T,T表示byte、short或char,而另一个操作数是一个int类型的“字面常量”,并且 2.它的值可以用类型T表示,那条件表达式的类型就是T。 3.否则,将对操作数类型进行提升,而条件表达式的类型就是第二个和第三个操作被提升之后的类型