Java中的int类型与Integer类之间的关系是面试Java中很常见的一类题,本文对int和Integer之间的相互关系进行一个简单介绍,在介绍之前先说一下Integer类的三种声明方式:1.  Integer a = new Integer(value); 2. Integer a = value; 3. Integer a = Integer.valueOf(value);下面详细介绍它们之间的关系

1. int == Integer

Integer声明语句任意,在这种类型的比较中,只要value值相同,则必定为true;因为Java的自动拆装箱特性,在Integer类与int基本类型进行“==”比较时,会对Integer类进行自动拆箱,所以“==”这一引用地址的判断就会退化为基本类型的数值判断。

2. Integer.equals(int)

Integer声明语句任意,这一操作为纯粹的数值比较,只要数值一样,返回true,在实际项目开发中equals函数运用广泛,并且一个小技巧是equals函数之前一般放置不会为空的对象,equals之后括号中放置可能为空的对象,可以避免错误。

3. Integer.equals(Integer)

Integer声明语句任意,同2,都是数值比较,数值相同则返回true。

4. Integer a = new Integer(value1); Integer b = new Integer(value2); a == b;

可以看到上述Integer声明方式为1,不管value值是否相同,全部返回false,因为上述语句表示判断a与b的引用地址是否相同,但是a和b都是新new出来的对象,其地址肯定不会相同,故返回false。

5. Integer a = value1(或Integer.valueOf(value1)); Integer b = value2(或Integer.valueOf(value2)); a == b;

可以看到上述Integer声明语句为2或者3,当-128<=value1,value2<=127时,只要value1=value2则必定返回true,因为在java5以后为了提高性能,在Integer类首次使用时,会初始化value=[-128, 127]范围内的Integer实例对象并且缓存起来,所以当出现上述情况时,a和b得到的引用地址其实都是缓存区中的同一对象,所以必定返回true。当value值超出[-128, 127]范围,则上述a和b又相当于创建了两个新的实例对象,地址肯定不同,即使value1=value2,也必定返回false。

测试代码如下:

public class IntegerTest {
	public static void main(String[] args){
		
		Integer i1 = 127;
		Integer i2 = 128;

		Integer k1 = Integer.valueOf(127);
		Integer k2 = Integer.valueOf(128);
		
		System.out.println(i1 == k1); //true,Integer声明方式为2或3,在[-128,127]内
		System.out.println(i2 == k2); //false,超出[-128,127]
		
		Integer j1 = new Integer(127);
		Integer j2 = new Integer(127);
		Integer j3 = new Integer(128);
		Integer j4 = new Integer(128);
		
		//只要是new出来的Integer,不管在不在[-128,127]都为false
		System.out.println(j1 ==j2); //false
		System.out.println(j3 == j4); //false
		System.out.println(j1 == j3); //false
		
		int c1 = 127;
		int c2 = 128;
		
		//Integer == int判断会进行Integer的拆箱,只要数值相同就返回true,
		System.out.println(c1 == i1); //true
		System.out.println(c2 == k2); //true
		System.out.println(c1 == j1); //true
	}

}