Integer与int的区别
int:八种原始数据类型(byte、int、short、long、float、double、char、boolean)之一。默认值是0,可以直接存储数据值。
Integer:是int的包装类,它有一个int类型的字段存储数据,并且提供了基本的操作。比如数学运算、int和字符串之间转换等。在Java5中引入了自动装箱和自动拆箱的功能,Java可以根据上下文,自动进行转换,极大地简化了相关编程。默认值是null,必须实例化才可以使用。
上面这些是一些基本上的概念,那么我们对比下面的一些值,请给出相应的答案
public static void main(String[] args) {
int i = 128;
Integer i2 = 128;
Integer i3 = new Integer(128);
System.out.println(i == i2);//(1)
System.out.println(i == i3);//(2)
Integer i5 = 127;
Integer i6 = 127;
System.out.println(i5 == i6)//(3)
/*Integer i5 = 128;
Integer i6 = 128;
System.out.println(i5 == i6)//(4)
*/ Integer ii5 = new Integer(127);
System.out.println(i5 == ii5); //(5)
Integer i7 = new Integer(128);
Integer i8 = new Integer(123);
System.out.println(i7 == i8); //(6)
}
(1)(2) true 。因为Integer和int进行比较,Integer会进行自动拆箱的操作。Integer通过intValue()方法来获得int的属性,从而跟int进行比较。
(3)true.。 因为Integer在-128——127进行值缓存操作,i5->Integer.valueOf(127)。valueOf代码如下。
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)//这里low是-128,high是127,这个是可以设置的
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
(4) false 128不在值缓存范围内,所以需要实例化。
(5) false 两个对象的指向不一样。
(6) false 指向的对象不一样。
小结:
①Integer与new Integer不会相等。因为指向的内存地址不一样。
②两个都是非new出来的Integer,如果数在-128——127之间,则是true,否则是false。
java在编译Integer i2 = 128时候,被翻译成-> Integer i2 = Integer.valueOf(128);
而valueOf()函数会在-127——128之间进行缓存。
③两个都是new出来的,都为false
④int和Integer进行比较,都为true,因为Integer会被自动拆箱为int再去比较
上一篇: Integer.valueOf(int)及自动装箱内幕
下一篇: Integer的自动装箱与拆箱