美文网首页
Integer 的==与equals

Integer 的==与equals

作者: printf200 | 来源:发表于2019-10-08 17:01 被阅读0次

    首先明白两点:

    对于基本数据类型 == 比较的是值,而对于类==比较的是内存地址

    equals由类自己实现,默认情况下比较的是内存地址

    java在1.5加入了自动装箱和拆箱
    考虑以下一个例子:

    Integer a =  127;
    Integer b = 128;
    

    第一眼看上去好像没什么区别,但其实内含玄机;
    首先这里会自动装箱,(i.e. 调用Integer.valueOf()方法)
    我们看下valueOf方法

    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
    

    这段代码说明,如果i的值在-128~127之间,会直接返回IntegerCache.cache缓存中的数据,而不是new一个新的Integer。
    这里IntegerCache是静态内部类,所以只要是-128~127之间的返回的值的内存地址都是一样的。这一点很重要。
    现在我们来举几个例子

    Integer a = 127;
    Integer b = 127;
    System.out.println(a == b); //true,这里a,b,是同一个内存地址
    Integer c = 128;
    Integer d = 128;
    System.out.println(c == d); //false,因为c , d都是new的
    

    同理Long,Byte等都是这样的原理
    结论:

    java内部回把Integer,Long等-128~127的值存储在常量池中,这些值内存地址相同
    Integer,Long等比较-128~127的值时 == 和equals都可以用于比较,否则一定要使用equals。

    相关文章

      网友评论

          本文标题:Integer 的==与equals

          本文链接:https://www.haomeiwen.com/subject/ldltrctx.html