摘自:https://www.dutycode.com/xijie_baozhuanglei_huancun_jizhi_integer_huancun.html

Integer的缓存机制: Integer是对小数据(-128~127)是有缓存的,再jvm初始化的时候,数据-128~127之间的数字便被缓存到了本地内存中,如果初始化-128~127之间的数字,会直接从内存中取出,不需要新建一个对象.

public static void main(String[] args) {

    Integer num1 = new Integer(100);
    Integer num2 = new Integer(100);
    System.out.println("num1==num2 " + (num1 == num2));     

    Integer num3 = 100;
    Integer num4 = 100;
    System.out.println("num3==num4 " +(num3 == num4));

    Integer num5 = 128;
    Integer num6 = 128;
    System.out.println("num5==num6 " + (num5 == num6));     

    Integer num7 = 100;
    Integer num8 = new Integer(100);
    System.out.println("num7==num8 " + (num7 == num8));     

    int num9 = 100;
    Integer num10 = new Integer(100);
    Integer num11 = 100;
    System.out.println("num9==num10 " + (num9 == num10));
    System.out.println("num9==num11 " + (num9 == num11));
}


//运行之后的输出结果是:

//num1==num2  false
//num3==num4  true
//num5==num6  false
//num7==num8  false
//num9==num10 true
//num9==num11 true
  • num1==num2 false 
    num1和num2的内存地址不一样,==的左右操作数如果是对象的话,那么比较的是引用的地址,new产生的对象一定是新的内存地址,所以,这里和Integer的缓存机制无关的,最终的结果便是false

  • num3==num4 true 
    num3和num4的初始化方式,直接将数字赋值,等价于下面:

Integer num3 = Integer.valueOf(100);

Integer的缓存机制: Integer是对小数据(-128~127)是有缓存的,再jvm初始化的时候,数据-128~127之间的数字便被缓存到了本地内存中,如果初始化-128~127之间的数字,会直接从内存中取出,不需要新建一个对象. 
所以,num3和num4实际上是引用的是一个内存地址,那么就是true了。

    • num5==num6 false 
      同上解析,128已经不在-128~127之间了,所以会new新对象,那么就是false

    • num7==num8 false 
      因为num8是new出来的,所以使用的内存地址和num7不一致,结果为false

    • num9==num10 true 
      num9的类型是int。Integer是int的包装类,在和int做比较的时候,会自动拆箱成int数值类型,所以,这里便变成了数字(int)的比较。

    • num9==num11 true 
      看清,num9 和 num11 .原理同上

posted on 2019-03-11 12:46  菜鸟01号  阅读(375)  评论(0编辑  收藏  举报