Designed by 77
加载资源 ......
感谢 ♥ 作者
先不感谢了

java中int和Integer的区别

Java中int类型和Integer类型的区别:

1.int是Java的一种基本数据类型,Integer是int的包装类(引用类型)。

2.int变量不需要实例化即可使用,而Integer变量必须要实例化后才能使用。(Integer实际上是引用类型,因此必须实例化才能使用,比如说使用关键字new。会看到有Integer num = 300的写法实际上也是实例化,因为Java提供了自动装箱拆箱的机制。)

3.int是直接存储数据值,而Integer实际上是对象的引用,存储的是指向实际值的指针。

4.int的默认值是0,Integer的默认值是null。

int变量和Integer变量的==比较

1.由于Integer变量实际上是对一个Integer对象的引用,所有两个通过new生成的Integer变量用==比较永远是不相等的(new生成的是两个对象,内存地址不同,==比较的是内存地址)。

Integer num1 = new Integer(100);
Integer num2 = new Integer(100);
System.out.println(num1 == num2); // false,==比较的是内存地址

2.Integer变量和int变量比较时,只要两个变量的值是相等的,则结果为true(包装类Integer和基本数据类型int比较的时候,Java会自动拆箱为int,然后进行比较,实际上就变为两个int变量的比较)。

Integer num1 = new Integer(100);
int num2 = 100;
System.out.println(num1 == num2); // true

3.非new生成的Integer变量和new Integer()生成的变量比较时,结果为false(非new生成的Integer变量指向的是Java常量池中的对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的地址不同)。

Integer num1 = new Integer(100);
Integer num2 = 100;
System.out.println(num1 == num2); // false

4.对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true;如果两个变量的值不在此区间,则比较结果为false。

Integer num1 = 100;
Integer num2 = 100;
Integer num3 = 128;
Integer num4 = 128;
System.out.println(num1 == num2); // true
System.out.println(num3 == num4); // false

这是因为Java在编译非new生成的Integer对象的时候,实际上是调用了Integer类的静态方法Integer.valueOf()方法。

public static Integer valueOf(int i){
    assert IntegerCache.high >= 127;
    if (i >= IntegerCache.low && i <= IntegerCache.high){
        return IntegerCache.cache[i + (-IntegerCache.low)];
    }
    return new Integer(i);
}

通过查看Integer.valueOf()方法的源码可以看出,Java对于-128到127之间的数会进行缓存(常量池),因此在这个范围内的数值实际上是指向缓存(常量池)中的对象,当不在这个范围的时候,才会在堆中new一个新的对象。

IntegerCache是Integer类的内部类,好好研究它的实现有助于对Integer字面量的理解。

private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);

            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

        private IntegerCache() {}
    }

 

"不知道什么时候开始,听故事的人变成了故事里的人。"

posted @ 2019-04-18 09:06  yanggb  阅读(3114)  评论(0编辑  收藏  举报