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

运行下面代码:

  

结果:

  

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

最新文章

  1. Less 语法特性
  2. TortoiseSVN使用方法
  3. 智能电表IEEE754 32位浮点格式
  4. 每天一个命令day1【diff 命令】(具体实例看下一节)
  5. c++ DISALLOW_COPY_AND_ASSIGN
  6. HTML5 学习笔记--------》HTML5概要与新增标签!
  7. [Firefly引擎][学习笔记一][已完结]带用户验证的聊天室
  8. MySQL 执行计划里的rows
  9. JavaWeb学习笔记二 Http协议和Tomcat服务器
  10. 小试ImageMagik——使用篇
  11. mac 常用技巧
  12. ThinkPHP实现支付宝接口功能 代码实例
  13. 目标检测之选择性搜索-Selective Search
  14. scrapy response.xpath可以提取包含字符XX的标签
  15. es6之更优雅的条件语句
  16. bzoj2440
  17. Linux性能优化 第七章 性能工具:网络
  18. elk日志平台搭建小记
  19. [六字真言]5.咪.功力不足,学习前端JavaScript异常
  20. 周立功USBCAN-II 上位机开发(MFC)

热门文章

  1. WPF中InkCanvas(墨水面板)用法
  2. Android StateListDrawable的坑
  3. Hibernate-ORM:14.Hibernate中的命名查询
  4. 区分Oracle的数据库,实例,服务名,SID
  5. 【题解搬运】PAT_L1-009 N个数求和
  6. nmon Analyser分析仪
  7. spring-boot分页插件
  8. eth day05
  9. 用express搭建一个简单的博客系统
  10. 学习bash——变量