A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© peiyanda 中级黑马   /  2015-12-13 20:02  /  798 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在学习代码时看到了这样一段:
// 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是基本类型,直接用==比较,就是做内存内数值的比较。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马