在学习代码时看到了这样一段:
// Long不能直接比较数值
if(long1.intValue() != long2.intValue()){……}
这个……有点汗。看一下下面这段代码:
Long maxLong = Long.MAX_VALUE;
System.out.println(maxLong + ", " + maxLong.intValue());
Long intLong = -1L;
System.out.println(intLong + ", " + intLong.intValue());
False(maxLong == intLong);
True(maxLong.intValue() == intLong.intValue());
很显然的,两个不相等的Long数值,其intValue()却相等了。
原因很简单。Long是64位,Integer是32位。将Long转为Integer的时候,实际上是直接丢弃高位数据,只保留低位数据。
而intValue()方法,实际的操作只有这一步:
public int intValue() {
return (int)value;
}
相当于10001被砍掉了最高位的1,于是只剩下最低位的1了。
那么要怎么样比较Long数值呢?可以参考下面的代码:
Long v1 = new Long(1L), v2 = new Long(1L);
False(v1 == v2);
True(v1.equals(v2));
True(v1.longValue() == v2.longValue());
以及
long vl1 = 1l, vl2 = 1l;
True(vl1 == vl2);
Long是装箱类型,直接用==运算符,比较的是两个对象的内存地址是否相等。因此不能这么干。
long是基本类型,直接用==比较,就是做内存内数值的比较。
|
|