美文网首页java面试java基础
Integer 的==与equals 引发的思考

Integer 的==与equals 引发的思考

作者: AlanSun2 | 来源:发表于2019-04-10 18:52 被阅读239次

首先明白两点:

  1. 对于基本数据类型 == 比较的是值,而对于类==比较的是内存地址
  2. 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等都是这样的原理

结论:

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

相关文章

网友评论

    本文标题:Integer 的==与equals 引发的思考

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