Integer

2016-03-02  本文已影响0人  X_未知

Integer

Integer a = 100, b = 100;
Integer c = 1000,d = 1000;
System.out.println(a == b);//true
System.out.println(c == d);//false

==比较的是两个对象的引用。
a、b、c、d都是新创建的对象,为什么不输出两个false?
参阅Integer.java这个类:

public static Integer valueOf(int i) {
    return  i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];
}

/**
 * A cache of instances used by {@link Integer#valueOf(int)} and auto-boxing
 */
private static final Integer[] SMALL_VALUES = new Integer[256];

static {
    for (int i = -128; i < 128; i++) {
        SMALL_VALUES[i + 128] = new Integer(i);
    }
}

声明Integer a = 100;会自动装箱,也就是调用的valueOf()方法把基本数据类型转换成Integer对象。

为优化性能,Integer中把-128-127 使用的频率比较高的小的数字缓存了下来。

当声明的Integer对象的值在-128-127之间的时候,引用的是同一个对象,所以结果是true。


Integer和int

Integer a = new Integer(1000);
int b = 1000;
Integer c = new Integer(10);
Integer d = new Integer(10);
System.out.println(a == b);//true
System.out.println(c == d);//false

先看第二个,既然Integer把-128-127缓存起来,为什么这里不是true?因为这里的Integer是new出来的,并不是用的缓存,所以结果是false。

再看第一个,为什么是true?首先值为1000,可见与Integer缓存无关系。注意b是int类型。当int和Integer进行==比较的时候,Java会把Integer进行自动拆箱,转成int类型,所以这里进行比较的是int类型的值。

上一篇下一篇

猜你喜欢

热点阅读