为什么Java中1000==1000为false而100==100为true?AND"2+2=5"?

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

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

运行下面代码:

结果:

按照我们之前所知道的,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?

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航