大家都知道Integer是有缓存的,当数值在-128~127之间,是从缓存中取数据。

    128 和 128 进行 == 的话 是返回false的

    | Integer a = 128;
    int a2 = 128;
    boolean b = Integer.valueOf(a2) == a; // false
    boolean equals = Integer.valueOf(a2).equals(a); //true
    System.out.println(“ —————————————“);
    Integer c = 127;
    int c2 = 127;
    boolean b1 = Integer.valueOf(c) == c2; //true
    boolean equals1 = Integer.valueOf(c).equals(c2); //true

    Integer d = 128 ;
    Integer d2 = 128 ;
    boolean d3 = Integer.valueOf(d) == d2; //false
    boolean d4 = Integer.valueOf(d).equals(d2); //true | | —- |



    int和Integer区别

    int是Java的基本数据类型,Integer继承了Object类,是对象类型,是int的包装类.

    值的存储
    int 存储在栈中

    Integer 对象的引用存储在栈空间中,对象的数据存储在堆空间中。

    初始化问题
    int初始化值是0 , Integer初始化值为null.

    传参

    int 是值传递,栈中的数据不可变。

    Integer 对象是引用传递,引用不可变,但是引用指向的堆空间地址中的值是可以改变的。

    泛型支持
    泛型不支持int,但是支持Integer。
    运算

    int 可以直接做运算,是类的特性。
    Integer 的对象可以调用该类的方法,但是在拆箱之前不能进行运算,需要转化为基本类型int。
    int是基本数据类型,Integer是引用数据类型;
    int默认值是0,Integer默认值是null;
    int类型直接存储数值,Integer需要实例化对象,指向对象的地址


    相同值下的 int 和 Integer 的比较结果
    两个通过new生成的变量,结果为false。
    int 和 Integer 的值比较,若两者的值相等,则为true。
    (注意:在比较时,Integer会自动拆箱为int类型,然后再做比较。)
    new 生成的Integer变量 和 非new 生成的Integer变量比较,,结果为false。
    (注意:new 生成的Integer变量的值在堆空间中,非new 生成的Integer变量的值在在常量池中。)
    (注意:非new生成的Integer变量,会先判断常量池中是否有该对象,若有则共享,若无则在常量池中放入该对象;也叫享元模式,后面再说。)
    两个非new 生成的Integer对象比较,则结果为true。
    (注意:此处需要一个前提:值的范围在 -128 ~ 127 之间。
    涉及到java对 int 与 Integer 的自动装箱和拆箱的一种模式:享元模式—flyweight,为了加强对简单数字的重复利用。
    在赋值时,其实是执行了Integer的valueOf()方法。
    当值在 -128 ~ 127之间时,java会进行自动装箱,然后会对值进行缓存,如果下次再有相同的值,会直接在缓存中取出使用。缓存是通过Integer的内部类IntegerCache来完成的。
    当值超出此范围,会在堆中new出一个对象来存储。
    PS:自动装箱与拆箱是在JDK1.5中出现的。

    内部类IntegerCache
    通过此类可以缓存简单数字。
    缓存的数大小可以由 -XX:AutoBoxCacheMax = 控制。
    jvm初始化时,java.lang.Integer.IntegerCache.high属性可以设置并保存在私有系统属性中。
    规定了low属性的值:-128