文档章节

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

小贱是个程序员
 小贱是个程序员
发布于 2016/11/22 13:52
字数 479
阅读 8
收藏 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); //
    }

 

本文转载自:http://www.importnew.com/22386.html

共有 人打赏支持
小贱是个程序员
粉丝 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
0
Java Integer判断是否相等

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

青竹风
2016/10/19
50
2
分布式文件服务 --gmfs

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

青苗
2015/08/13
1K
0
想做个上传文件的负载均衡,但是HttpURLConnection没有端口号,传输的文件会找不到地址?

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

逍遥之影
2017/09/12
101
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
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

shell-日志脚本小实验

1.查找日志2018-8-15,求得那一分钟访问量最大。 #/bin/bash#from cc#2018-8-15#2018-08-15.log 哪一分钟 访问量 最大for d in `ls /data/nginx/logs/`doif [ -a 2018-08-15...

chencheng-linux
昨天
0
0
Android中的设计模式之状态模式

参考 《设计模式:可复用面向对象软件的基础 》5.8 State 状态 对象行为型模式 《Android源码设计模式解析与实战》第7章 随遇而安--状态模式 意图 允许一个对象在其内部状态改变时改变它的行...

newtrek
昨天
0
0
xshell端 vim没有颜色

说明 使用xshell连接服务器的时候,使用vim打开文档没有颜色 解决方法: 1.在更目录home或者etc下找到vim的配置文件vimrc 2.vim打开它找个坑,添加下面这个东西 set t_Co=256 3.保存退出,就...

杉下
昨天
0
0
spring 资料

spring boot http://www.ityouknow.com/springboot/2016/01/06/spring-boot-quick-start.html

zaolonglei
昨天
2
0
TypeScript基础入门 - 函数 - 简介

转载 TypeScript基础入门 - 函数 - 简介 项目实践仓库 https://github.com/durban89/typescript_demo.gittag: 1.1.6 为了保证后面的学习演示需要安装下ts-node,这样后面的每个操作都能直接...

durban
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部