Integer的缓存机制

Posted tianxuwei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Integer的缓存机制相关的知识,希望对你有一定的参考价值。

摘自: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 .原理同上

以上是关于Integer的缓存机制的主要内容,如果未能解决你的问题,请参考以下文章

从JDK源码理解Java Integer的缓存机制

从JDK源码理解Java Integer的缓存机制

Integer的缓存机制

Integer的缓存机制

翻译Integer Cache In Java(在Java中的Integer缓存机制)

Java中整型的缓存机制