Java Integer对象的比较及自动装箱和自动拆箱过程

1、首先介绍一下自动装箱和自动拆箱过程,
自动装箱,就是把基本数据类型用他们对应的引用类型包装起来,使他们可以具有对象的特质。例如我们可以把int类型包装成Integer类型的,把double类型的包装成Double类型的。
自动拆箱,就是进行与自动装箱相反的操作。
自动装箱的过程:当需要一种类型的对象时,这种基本数据类型就自动封装到与它对应的包装类中。
自动拆箱的过程:当需要一个数值时,被装箱的对象中的值就会被自动提取出来,没有必要再去调用intValue()和doubleValue()等方法。
2、在JAVA中,"=="比较的是对象的引用,而不是值(value)

3、运行下面的代码:
Integer val11 = 100;
Integer val12 = 100;

Integer val21 = 127;
Integer val22 = 127;

Integer val31 = 1000;
Integer val32 = 1000;

System.out.println(val11 == val12);
System.out.println(val21 == val22);
System.out.println(val31 == val32);
System.out.println(val31.intValue() == val32.intValue());
System.out.println(val11 == 100);
System.out.println(val31 == 1000);

结果是:
true
true
false
true
true
true

分析上面的结果 :
1和2返回true,
虽然比较的是对象的引用,但是自动装箱时,java在编译的时候Integer a=100,被编译成Integer a=Integer.valueOf(100)。因此,关键就在于valueOf()这个方法。
// IntegerCache.low = -128
// IntegerCache.low = -127
public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}
通过valueOf()到的Integer对象,如果取值范围在-128到127之间,就会返回 IntegerCache 缓存的Integer对象,超过这个范围,就new一个对象返回。每new一个对象,都会在堆中为这个对象分配地址。

3是返回false,
因为其取值范围不在-128到127之间,比较的对象地址。
4是调用intValue()方法返回其value值,所以是true
5和6是因为进行了自动拆箱,比较的是基本数据类型,因此"=="比较的是其数值,结果数true。




上一篇:Python3 迭代器深入解析


下一篇:Integer-源码