其实这个问题也是在 Java 基础面试常常遇到的一个问题,以前没注意过,直到遇到 bug,顺便记下来吧。 做客户端“忘记密码”功能有一个 bug,今天调试时,发现了原因: 功能模块中有一段: if(userpo.getId() != Long.valueOf(uid)){ throw new VerifyExcepti ..

关于 Java 中 Integer 和 Long 类型对象对比的问题

本贴最后更新于 1087 天前,其中的信息可能已经时过境迁

其实这个问题也是在 Java 基础面试常常遇到的一个问题,以前没注意过,直到遇到 bug,顺便记下来吧。

做客户端“忘记密码”功能有一个 bug,今天调试时,发现了原因:

功能模块中有一段:

if(userpo.getId() != Long.valueOf(uid)){
    throw new VerifyException("mobile have been binded for uid=" + uid ,
        AppCode.VERIFY_MOBILE_IS_BIND);
}

问题就出在两个 Long 型对象的比较。其实即使是 Java 初学者,学习过对象比较,也应该知道要用 equals 方法,额... 这个错误确实比较低级。

疑问:当初代码肯定是通过测试的,那当初是为什么会通过测试?带着疑问,查了一些资料。结论是 Integer 和 Long 内部实现是有缓存的。

例如我写了一个测试类测试 Integer 和 Long 类型对象的比较:

public class Test {
    public static void main(String[] args) {
        Integer a = new Integer(10);
        Integer b = new Integer(10);
        System.out.println("a==b:" + (a==b)); //很明显false
        Integer c = 129;
        Integer d = 129;
        System.out.println("c==d:" + (c==d)); //false
        Integer e = 127;
        Integer f = 127;
        System.out.println("e==f:" + (e==f));//true
        Long h = 128L;
        Long g = 128L;
        System.out.println("h==g:" + (h==g));//false
        System.out.println("h.equals(g):" + h.equals(g));//true
        System.out.println("h.compareTo(g):" + h.compareTo(g));// 0
        Long k = 127L;
        Long m = 127L;
        System.out.println("k==m:" + (k==m));//true
    System.out.println("k.equals(m):" + k.equals(m));//true
    System.out.println("k.compareTo(m):" + k.compareTo(m));// 0
}

}

执行结果:

a==b:false
c==d:false
e==f:true
h==g:false
h.equals(g):true
h.compareTo(g):0
k==m:true
k.equals(m):true
k.compareTo(m):0

查看 Integer 源代码后发现 Integer 有个内部类 IntegerCache,它维护了一个 Integer 数组 cache[] ,长度为 256,还有一个静态块

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

很明显这个静态块已经默认认创建出了-128~127 的 Integer 数据。 Integer 在创建对象时,若值在 (-128 到 127) 范围内,则直接从缓冲区中取,若超过该范围则创建新对象,所以在 -128 到 127 范围内 Integer 对象值相同时,对象 == 返回 true

Long 对象同理。

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    2265 引用 • 7659 回帖 • 933 关注
回帖   
请输入回帖内容...