美文网首页
为什么在 Java 中1000==1000返回false,而10

为什么在 Java 中1000==1000返回false,而10

作者: ByteBlade | 来源:发表于2016-08-24 08:31 被阅读62次

    标签: Integer


    如果你运行下面的代码:

    @Test
    public void test() { 
      Integer a = 1000, b = 1000; 
      System.out.println(a == b);//1
      Integer c = 100, d = 100;
      System.out.println(c == d);//2
    }
    

    你得到的结果是

    false
    true
    

    我们对生成的class文件进行反编译得到实际运行的代码

    @Test
    public void test() { 
      Integer a = Integer.valueOf(1000); 
      Integer b = Integer.valueOf(1000);
      System.out.println(a == b); 
      Integer c = Integer.valueOf(100);
      Integer d = Integer.valueOf(100); 
      System.out.println(c == d);
    }
    

    java中的数据类型,可分为两类:

    1. 基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean他们之间的比较,应用双等号(==),比较的是他们的值。
    2. 列表项复合数据类型(类) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false

    我们查看官方文档的valueOf 方法

    public static Integer valueOf(int i) {    
      if (i >= IntegerCache.low && i <= IntegerCache.high)        
        return IntegerCache.cache[i + (-IntegerCache.low)];      
      return new Integer(i);
    }
    

    这个方法通过缓存经常使用的值,有显著的空间和时间的优化。这个方法缓存的范围是-128~127所以而当int的值不在上述范围内,比如1000,每次都会new出一个新的对象,不同对象的引用地址不同,所以第一个的结果是false。
    当int的值在-128-127的范围内,会从Integer内部缓存的对象中选取,同一个int值对应同一个对象,所以第二的结果是true。

    相关文章

      网友评论

          本文标题:为什么在 Java 中1000==1000返回false,而10

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