Integer

作者: X_未知 | 来源:发表于2016-03-02 10:36 被阅读0次

    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类型的值。

    相关文章

      网友评论

          本文标题:Integer

          本文链接:https://www.haomeiwen.com/subject/vdmdkttx.html