首先先给出结论
1、Integer有一个常量池,存放着-128~127之间的数值,在这里的数值在用的时候会从这个缓存中取
2、Integer i = 2,实际上是调用 Integer i = Integer.valueOf(2);
3、Integer和int比较时,会自动拆箱转换为int,基本类型通过==比较大小
4、==号比较的是内存地址,equals比较的值
5、从java1.5开始Integer和int会进行自动拆箱和装箱
6、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);
}
例子1
Integer a1 = new Integer(1);
Integer a2 = new Integer(1);
System.out.println(a1 == a2); // false
System.out.println(a1.equals(a2)); // true
答:
①为什么==不相等?因为两个Integer是两个不同的对象,地址不同所以false
②为什么equals相等?因为equals比较的是值
下面是equals源码
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
例子2
Integer a1 = 2;
Integer a2 = 2;
Integer b1 = 222;
Integer b2 = 222;
System.out.println(a1 == a2); //true
System.out.println(b1 == b2); //false
System.out.println(a1.equals(a2)); //true
System.out.println(b1.equals(b2)); // true
答:
①为什么a1== a2为true,b1==b2为flase
因为在Integer中存在一个常量池会把再-128-127之间的数都放置进去,在下次使用时会直接调用常量池中的数,如果不存在则会调用new Integer(int i)所以b1和b2表面上是相同的数,但实际上调用了两次new Integer()
②两个equals为什么相等
因为equlas比较的值的大小
例子3
Integer a1 = new Integer(2);
Integer a2 = 2;
System.out.println(a1 == a2); //false
System.out.println(a1.equals(a2)); // true
答:
①为什么a1 == a2是false,因为a1是对象所以两者不相等
例子4
Integer a1 = new Integer(2);
int a2 = 2;
System.out.println(a1 == a2); //true
答:
①为什么a1 == a2,因为会调用拆箱把Integer转换为int,从而比较值(和Integer的缓冲池无关)