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

2016-08-24  本文已影响62人  ByteBlade

标签: 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。

上一篇下一篇

猜你喜欢

热点阅读