基本数据类型和封装类中的equals和==

以int和Integer类型为例。

Integer自动装箱:

  Integer a1 = 128;
  Integer a2 = 128;
  System.out.println(a1 == a2);  //false
  System.out.println(a1.equals(a2));  //true
  Integer b1 = 127;
  Integer b2 = 127;
  System.out.println(b1 == b2);  //true
  System.out.println(b1.equals(b2));  //true

在进行自动装箱时,编译器会使用Integer.valueOf()方法。

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

如果传入的整数在-128-127之间,返回的是一个缓存池中的值。

	cache = new Integer[(high - low) + 1];
	int j = low;
	for(int k = 0; k < cache.length; k++)
		cache[k] = new Integer(j++);

如果超出该范围,创建的是新的对象实例。

对于equals方法,比较的是Integer对象对应的int值:

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

总结一下:
如果通过new Integer(),每次都会创建新的对象;
如果通过Integer.valueOf()或进行自动装箱,当int值在-128~127之间时,“==” 为true,超出该范围创建新对象。
比较Integer类型变量是否相等应该使用equals方法。

猜你喜欢

转载自blog.csdn.net/tjgongxl/article/details/89644947
今日推荐