文档章节

为什么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
想做个上传文件的负载均衡,但是HttpURLConnection没有端口号,传输的文件会找不到地址?

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

逍遥之影
2017/09/12
101
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7防火墙firewalld操作

firewalld Linux上新用的防火墙软件,跟iptables差不多的工具。 firewall-cmd 是 firewalld 的字符界面管理工具,firewalld是CentOS7的一大特性,最大的好处有两个:支持动态更新,不用重启服...

dingdayu
今天
1
0
关于组件化的最初步

一个工程可能会有多个版本,有国际版、国内版、还有针对各种不同的渠道化的打包版本、这个属于我们日常经常见到的打包差异化版本需求。 而对于工程的开发,比如以前的公司,分成了有三大块业...

DannyCoder
今天
2
0
Spring的Resttemplate发送带header的post请求

private HttpHeaders getJsonHeader() { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); ......

qiang123
昨天
3
0
Spring Cloud Gateway 之 Only one connection receive subscriber allowed

都说Spring Cloud Gateway好,我也来试试,可是配置了总是报下面这个错误: java.lang.IllegalStateException: Only one connection receive subscriber allowed. 困扰了我几天的问题,原来...

ThinkGem
昨天
28
0
学习设计模式——观察者模式

1. 认识观察者模式 1. 定义:定义对象之间一种一对多的依赖关系,当一个对象状态发生变化时,依赖该对象的其他对象都会得到通知并进行相应的变化。 2. 组织结构: Subject:目标对象类,会被...

江左煤郎
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部