今天面试官问了我两个很简单的问题,竟然没打出来,真是羞愧,以后要好好积累!
1、Integer的两个对象如何比较?
乍看一下使用“==”来比较就好啦,实际不然,“==”比较的是堆中的地址,Integer是int的包装类,Integer的对象值在jdk1.5以上可以自动装箱拆箱,所以平时比较没有注意
但Integer的源码如下,可以看出,若对应的值大于IntegerCache.low,并小于IntegerCache.high,返回的值是同一个地址的值,若不在这个返回内,则返回的是新的Integer对象,自然堆栈中的地址值就不一致了
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
注:IntegerCache.low为-127,IntegerCache.high=128,所以在这个范围内比较是没有问题的
若超出这个范围如何比较呢?需要用到Integer.intValue()或者用equals方法比较即可
2、double类型的值如何比较?精度不明
(1)若比较是否相等,可以用转换String字符串,利用equals来比较,这种方式只适合精度相同的
(2)若比较大小,可以用Double.doubleToLongBits()方法转换,然后用“==”,“>”或者“<”来比较
(3)若比较是否相等,精度不明,则可以用相减的方式,然后比较减法之后的这个值的精度来确定。