文档章节

为什么1000 == 1000返回为False,而100 == 100会返回为True?

小贱是个程序员
 小贱是个程序员
发布于 2016/11/22 13:52
字数 479
阅读 8
收藏 0
点赞 0
评论 0

如果你运行如下代码:

Integer a = 1000, b = 1000; 
System.out.println(a == b);//1
Integer c = 100, d = 100; 
System.out.println(c == d);//2

你会得到以下运行结果:

false
true

我们知道,如果两个引用指向同一个对象,那么==就成立;反之,如果两个引用指向的不是同一个对象,那么==就不成立,即便两个引用的内容是一样的。因此,结果就会出现false。

这是非常有趣的地方。如果你查看Integer.java类,你会找到IntegerCache.java这个内部私有类,它为-128到127之间的所有整数对象提供缓存。

这个东西为那些数值比较小的整数提供内部缓存,当进行如此声明时:

Integer c = 100;

它的内部就是这样的:

Integer i = Integer.valueOf(100);

如果我们观察valueOf()类函数,我们可以看到

public static Integer valueOf(int i) {
      if (i >= IntegerCache.low && i
          return IntegerCache.cache[i + (-IntegerCache.low)];
      return new Integer(i);
    }

如果值在-128到127之间,它就会返回该缓存的实例。

因此。。。两者指向同样的对象。

Integer c = 100, d = 100;

这就是为什么这段代码的结果为true了:

System.out.println(c == d);

现在你可能会问,为什么会为-128到127之间的所有整数设置缓存?

这是因为在这个范围内的小数值整数在日常生活中的使用频率要比其它的大得多,多次使用相同的底层对象这一特性可以通过该设置进行有效的内存优化。你可以使用reflection API任意使用这个功能。

运行下面的这段代码,你就会明白它的神奇所在了。

public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
 
      Class cache = Integer.class.getDeclaredClasses()[0]; //1
      Field myCache = cache.getDeclaredField("cache"); //2
      myCache.setAccessible(true);//3
 
      Integer[] newCache = (Integer[]) myCache.get(cache); //4
      newCache[132] = newCache[133]; //5
 
      int a = 2;
      int b = a + a;
      System.out.printf("%d + %d = %d", a, a, b); //
    }

 

© 著作权归作者所有

共有 人打赏支持
小贱是个程序员
粉丝 3
博文 39
码字总数 14357
作品 0
珠海
程序员
为什么1000 == 1000返回为False,而100 == 100会返回为True?

本文翻译自 dzone.com,由回忆和感动翻译,转载请注明文章来自慧都控件网 这是我们今天要讨论的话题,因为我觉得它非常的有趣。 如果你运行如下代码: Integer a = 1000, b = 1000; System.o...

Ye_Kwii ⋅ 2016/11/25 ⋅ 0

Java Integer判断是否相等

一般来说,我们平常知道的都是,数值型对象如Integer比较,会有装箱和拆箱的过程。而且代码中很容易就会写出 其中上面这样写是有问题的,我们来看下两段代码 代码一: 代码二: 运行这两段代...

青竹风 ⋅ 2016/10/19 ⋅ 2

分布式文件服务 --gmfs

golang 基于 gridFs 的分布式文件服务。 支持: 1、POST GET 上传 2、图片大小控制 3、文件下载,秒传,转正处理 等 golang 基于 gridFs 的分布式文件服务 Window 启动 mongodb 命令: mong...

青苗 ⋅ 2015/08/13 ⋅ 0

想做个上传文件的负载均衡,但是HttpURLConnection没有端口号,传输的文件会找不到地址?

举例说明下问题: 一个 5g的文件, 循环第一次,传输了100m,收到返回消息,再第二次传输100m,直到完成。 如果url写上端口,实现这个,下面代码没有问题。 如果不写端口,第一次的 100m ,服...

逍遥之影 ⋅ 2017/09/12 ⋅ 0

浮点数值Number 正负无穷infinity -infinity

//浮点数值范围 alert(Number.MIN_VALUE);//最小值 alert(Number.MAX_VALUE);//最大值 //无穷(正无穷)infinity var box=10e1000;//值显示infinity正无穷 alert(box); //无穷(负无穷) va...

sinat_34719507 ⋅ 2016/12/29 ⋅ 0

Extjs4 form and chart

求助:我的后台php返回的 {data:[{"mydate":"20130120","count":20,"average":23.1},{"mydate":"20130122","count":2,"average":30.2},{"mydate":"20130123","count":25,"average":10.2}]} ......

三色堇小盆友欧巴 ⋅ 2013/02/02 ⋅ 0

spring-cloud 中 zuul 的两种隔离机制实验

(点击上方公众号,可快速关注) 来源:大名Dean鼎, www.deanwangpro.com/2018/04/04/spring-cloud-zuul-threads/ ZuulException REJECTEDSEMAPHOREEXECUTION 是一个最近在性能测试中经常遇...

ImportNew ⋅ 04/24 ⋅ 0

解决js代码中加入alert()就成功执行,不加就不对的问题!

因为return false的作用域在each循环中,它只起到了结束当前循环的作用,相当于break,并没有返回任何类型的值 转众多网友意见 问题: 我是做一个回车事件处理,翻页的那种,在一个页面上成功...

习惯了-想你 ⋅ 2016/11/30 ⋅ 0

Expressbody-parser(四)

常用API 1. bodyParser.text(options) 解析文本格式 返回一个仅处理字符串格式处理的中间件。其后的所有的req.body中将会是一个字符串值。 1. defaultCharset - 如果Content-Type后没有指定编...

博为峰教研组 ⋅ 2016/11/23 ⋅ 0

PgSQL · 源码分析 · 优化器逻辑推理

背景知识 数据库优化器需要具备逻辑推理能力,而且越强越好,为什么呢? 举一些例子, 通过已知的一个人讲的是真话,推理另一个人讲的一定是真话或一定是假话。 例子1: 假设预先提供了 a > ...

阿里云RDS-数据库内核组 ⋅ 2016/03/04 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

HiSDP —— 高效的C++软件开发平台

目前阿里集团每天有近1000PB的数据是通过LogAgent采集的,为了让LogAgent做到资源占用节省和高效采集,背后是基于HiSDP去构建的。 缘由 当决定采用C++编程语言去开发一个软件时,紧接着所面临...

阿里云云栖社区 ⋅ 13分钟前 ⋅ 0

zookeeper-3.4.12 下载与安装教程

一、zookeeper下载地址 http://mirrors.hust.edu.cn/apache/zookeeper/ 二、启动教程 把压缩包放在指定目录下 第三: 进入 conf文件夹底下 zoo_sample.cfg 文件名改成 zoo.cfg 第四步: 进入b...

泉天下 ⋅ 14分钟前 ⋅ 0

Oracle 中文日期转换

SELECT TO_date('2011年11月11日', 'yy"年"mm"月"dd"日"') FROM DUAL; 1. Oracle无法识别中文格式,所以添加双引号。 2. 后面的格式是指字符串在转换前的格式,而不是指转换后的格式。...

江戸川 ⋅ 16分钟前 ⋅ 0

MySell:API Spring Boot

起步 类目 商品 订单

BeanHo ⋅ 18分钟前 ⋅ 0

Spring方法拦截器MethodInterceptor

参考资料 1、Spring方法拦截器MethodInterceptor 2、Sharding JDBC源码分析-JdbcMethodInvocation类的作用

哎小艾 ⋅ 21分钟前 ⋅ 0

正则表达式

元字符 元字符,又叫字符集,就是用一些特殊符号表示特定种类的字符或位置。 匹配字符 . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d 匹配数字 匹配...

wangchen1999 ⋅ 21分钟前 ⋅ 0

数据库数据导入Elasticsearch案例分享

基于bboss持久层和bboss elasticsearch客户端实现数据库数据导入es案例分享(支持各种数据库和各种es版本) 1.案例对应的源码 https://gitee.com/bboss/bboss-elastic/blob/master/bboss-el...

bboss ⋅ 22分钟前 ⋅ 0

动手---sbt(2)

参考 https://blog.csdn.net/leishangwen/article/details/46225587 建立一个chisel_max目录,文件内容如后面所述,现在开始执行命令: joe@joe-Aspire-Z3730:/media/sdb4/download/scala$ c......

whoisliang ⋅ 29分钟前 ⋅ 0

纯js实现最简单的文件上传(后台使用MultipartFile)

<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>XMLHttpRequest上传文件</title> <script type="text/javascript"> //图片上传 var xhr......

孟飞阳 ⋅ 34分钟前 ⋅ 0

iOS宇宙大战游戏、调试工具、各种动画、AR相册、相机图片编辑等源码

iOS精选源码 日期时间选择器,swift Space Battle 宇宙大战 SpriteKit游戏源码 LLDebugTool - 便捷的IOS调试工具(新增截屏功能) 相机扫描or长按识别二维码、FMDB、键盘动态高度、定位等 动画...

sunnyaigd ⋅ 35分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部