文档章节

为什么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
博文 42
码字总数 18418
作品 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
浮点数值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
解决js代码中加入alert()就成功执行,不加就不对的问题!

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

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

没有更多内容

加载失败,请刷新页面

加载更多

js垃圾回收机制和引起内存泄漏的操作

JS的垃圾回收机制了解吗? Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“...

Jack088
昨天
17
0
大数据教程(10.1)倒排索引建立

前面博主介绍了sql中join功能的大数据实现,本节将继续为小伙伴们分享倒排索引的建立。 一、需求 在很多项目中,我们需要对我们的文档建立索引(如:论坛帖子);我们需要记录某个词在各个文...

em_aaron
昨天
27
0
"errcode": 41001, "errmsg": "access_token missing hint: [w.ILza05728877!]"

Postman获取微信小程序码的时候报错, errcode: 41001, errmsg: access_token missing hint 查看小程序开发api指南,原来access_token是直接当作parameter的(写在url之后),scene参数一定要...

两广总督bogang
昨天
31
0
MYSQL索引

索引的作用 索引类似书籍目录,查找数据,先查找目录,定位页码 性能影响 索引能大大减少查询数据时需要扫描的数据量,提高查询速度, 避免排序和使用临时表 将随机I/O变顺序I/O 降低写速度,占用磁...

关元
昨天
15
0
撬动世界的支点——《引爆点》读书笔记2900字优秀范文

撬动世界的支点——《引爆点》读书笔记2900字优秀范文: 作者:挽弓如月。因为加入火种协会的读书活动,最近我连续阅读了两本论述流行的大作,格拉德威尔的《引爆点》和乔纳伯杰的《疯传》。...

原创小博客
昨天
36
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部