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
}
}