Integer与int类型的关系,可以简单的回答,Integer是int的包装类,int的默认值是0,而Integer的默认值是null(jdk1.5的新特性 自动装箱和拆箱,Integer.valueOf() 和xx.intValue() ),需要注意的是Integer里面默认的缓存数字是-128-127,1、Integer与Integer相互比较,数据在-128-127范围内,就会从缓存中拿去数据,比较就相等;如果不在这个范围,就会直接新创建一个Integer对象,使用 == 判断的是两个内存的应用地址,所以自然不相等。2、Integer和int类型相比,在jdk1.5,会自动拆箱,然后比较栈内存中的数据,所以没有不想等的情况

Integer函数查看

Integer的valueOf函数,在我们可以看到,会去判断这个值是否是在IntegerCache中,如果i在(-128到127)之间,就会返回缓存对象,如果不是就会重新new 一个Integer对象

这是非常有趣的地方。如果你查看Integer.java类,你会找到IntegerCache.java这个内部私有类,它为-128到127之间的所有整数对象提供缓存。

重点:

1.Java里面“==”与equals()的区别:前者比较的是地址,后者比较的是内容。
2.int 是在栈里创建的,Integer是在堆里创建的。栈里创建的变量要比在堆创建的速度快得多。
3.基本数据类型byte、short、int、long、float、double、boolean、char 都是不能在堆中创建内存

    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中缓存数字

在加法和减法中,计算后的结果会先看是否在Integer中是否有缓存,如果有,就返回索引的地址,如果没有,就会直接反悔new Integer()对象

 public static void main(String [] args) throws Exception{

        //获取声明的对象
        Class intClazz= Integer.class.getDeclaredClasses()[0];

        //获取cache字段
        Field myCache = intClazz.getDeclaredField("cache");
        //设定可以修改cache字段
        myCache.setAccessible(true);

        //获取cache字段中缓存的数据
        Integer[] newCache = (Integer[]) myCache.get(intClazz);

        //cache 里面存储的就是-128 到127的字段
        //打印Integer 中缓存的数字
        System.out.println(Arrays.asList(newCache));

        //修改4在缓存中的数据, 将4 改为 6666
        newCache[132] = 6666;

        //然后做加法
        int a = 2;
        int b = a + a;
        //打印结果
        System.out.printf("%d + %d = %d", a, a, b);
    }

Java之Integer与int类型数据的比较-yellowcong_java

Integer和Integer比较

从下面一个例子,发现666的Integer相比较,不相等,而100的相比较,是相等的,这是由于Integer的缓存,在-128到127范围内,他们获取的是同一个对象,所以地址自然相同,而不在这个范围,就会直接返回new Integer对象,这样自然两个的引用地址不一样,自然会不同。

    public static void main(String [] args) throws Exception{

        Integer a =100,b = 100;
        Integer c = 666,d = 666;
        System.out.println(a == b);//true
        //666不在 -127到128的范围内,所以反回的是new Integer 对象
        System.out.println(c == d);//false
    }

int 和int比较

int数据类型,都是在栈内存中存储,如果这个数字在栈内存中存在就会直接指向这个内存地址,如果不存在,就会重新开辟内存空间,所以int和int类型的比较,相同的值不会存在内存不等的情况

八个基本数据类型不能看作对象(这点很特殊),存放在栈中。栈内操作速度快,创建销毁很容易

    public static void main(String [] args) throws Exception{

        int a = 222;
        int b = 222;
        double c = 222;
        System.out.println(b == a);//true
        System.out.println(c == a);//true
    }

Intege和int比较 & int和Integer比较

这两个数据的相互比较,无论是谁和谁比,都最终比较的是存在栈中的值,因为int是基本数据类型,不能在对中创建数据,所以无论咋比较,都是将堆中的Integer拆箱(xx.intValue)为int类型的数据,然后进行比较
int和integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比

无论是a比较b,还是b比较a,都是栈内存中的拆箱后进行比较。

Integer a = 222;
double b = 222;
System.out.println(a == b); //true