【原创】为什么1000==1000为false而100==100为true

今天在书上忽然看到了这样的一个问题,1000==1000为false,而100==100为true,心中不禁疑惑,特地上网查询,发现还是自己孤陋寡闻了。特地来与大家分享一下。


如果在你的eclipse中运行这样一段代码


你会得到false,

但是如果把1000改成100,将会得到不一样的结果。

你会得到结果 true


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

因此,按正常来推理的话,第二个结果应该也是false。

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

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

Integer a = 100;


时,它实际在内部做的是

Integer a = Integer.valueOf(100);


现在,如果我们去看valueOf()方法,我们可以看到


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

所以…

Integer a = 100;

Integer b =100;

指向了同一个对象

这就是为什么我们写

syso(a==b)

结果是true的原因。



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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,859评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,742评论 18 399
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,516评论 0 3
  • 【内容摘要】 技术背景的项目形式风格偏硬,喜欢撸起袖子自己干,往往不注意软技能的修炼。而非技术背景的项目经理往往行...
    郭致星阅读 1,015评论 3 21
  • 感赏今天的天气真好,早上起床送儿子上学,老公搂着耍赖,就不让起床。我说送我儿子再回来陪你。 感赏儿子今天心情也很好...
    连娟a阅读 125评论 0 0