美文网首页
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