Long类型数据比较

之所以记录是因为在开发过程当中,碰到了两次因为个人原因Long类型判断出错导致的bug,因此在此关于Long类型数据比较做一个记录。
注意:long类型和Long类型是不一样,long类型属于基本的数据类型,而Long是long类型的包装类,至于区别是什么再次不做过多详细的解释。

1. 首先说==和equals()方法的区别:
==号在比较基本数据类型,比如int作比较的时候比较的是值。而当去比较两个对象的时候,便成了比较两个对象的地址,在开始的时候也说Long类型是long的包装类因此当用==比较的时候便会发生错误。
equals()方法存在于Object类当中,Object是所有类的直接和间接父类,Object类当中的equals源码当中写了,当没有重写equals()方法时,equals()和==的效果是一样的,但是像Long这种包装类都是重写了equals()方法的。

2. 怎么去比较两个Long类型的数据:
第一种方法使用Long类型的longValue()方法,这个方法作用是:取到Long类型当中的值,然后我们就可以正常的用==去比较,例如:

Long a = new Long(345);
Long b = new Long(345);
System.out.println(a.longValue()==b.longValue())

第二种方法使用Long类型的equals()方法,这个方法我们可以去查看一下源码,源码如下:

public boolean equals(Object obj) {
        if (obj instanceof Long) {
            return value == ((Long)obj).longValue();
         }
         return false;
     }

查看源码我们可以发现,Long类型的equals()方法当中,也调用longValue()方法然后再去比较大小。
因此在使用过程当中我们可以采用这两种方式去进行比较Long对象(类型)的大小。
其实一开始也解释了,Long属于对象,对于对象来讲大家都知道不能直接用==去比较。
注意:这可能是让人费解的一个地方,请看如下代码

Long i = 12L;
Long j = 12L;
System.out.println(i==j);//true

很神奇,比较i和j的时候是Long类型,然后取比较打印的结果是true,之所以会产生这种现象是因为Long类型内部有一个内部类,维护了一个cache。源码当中是这样写的:

//552行
public static Long valueOf(long l) {
    final int offset = 128;
    if (l >= -128 && l <= 127) { // will cache
        return LongCache.cache[(int)l + offset];
    }
        return new Long(l);
}
//528行
private static class LongCache {
    private LongCache(){}

    static final Long cache[] = new Long[-(-128) + 127 + 1];

    static {
        for(int i = 0; i < cache.length; i++)
        cache[i] = new Long(i - 128);
    }
 }

也就是说在-128到127的值,都放在了cache中,不会新创建对象,因此==是成立的,当超过了这个范围,便无法使用==进行判断了。

关于Long类型的比较就这些,如果有说的不对的请及时指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值