你的位置:首页 > Java教程

[Java教程]为什么 Java中1000==1000为false而100==100为true?AND 2+2=5?

 前提:我们知道,如果两个引用指向同一个对象,用==表示它们是相等的。如果两个引用指向不同的对象,用==表示它们是不相等的,即使它们的内容相同。 

 运行下面代码:

  

结果:

  

   按照我们之前所知道的,a==b 也应该return false;   Why?

  这就是代码有趣的地方。如果你去看Integer.java类,你会发现有一个内部私有类,IntegerCache.java,它缓存了从-128到127之间的所有的整数对象。

   所以事情就成了,所有的小整数在内部缓存,然后当我们声明类似——

  时,它实际在内部做的是: 

  进入valueof()方法,可以看到

  

  

  如果值的范围在-128到127之间,它就从高速缓存返回实例。

  所以指向了同一个对象

  这样就得到a==b为true

  现在你可能会问,为什么这里需要缓存?

  合乎逻辑的理由是,在此范围内的“小”整数使用率比大整数要高,因此,使用相同的底层对象是有价值的,可以减少潜在的内存占用。

  然而,通过反射API你会误用此功能。

  运行下面的代码,享受它的魅力吧

  

  

  译文链接:http://www.codeceo.com/article/why-java-1000-100.html
     英文原文:Why 1000 == 1000 Returns False, but 100 == 100 Returns True in Java?