为什么1000==1000返回false,100==100返回true?

这可能是个讨论得较多的话题,但是我觉得它很有趣:为什么1000==1000返回false,100==100返回true?

public static void main(String[] args) {
    Integer a = 1000, b = 1000;
    System.out.println(a == b);
    Integer c = 100, d = 100;
    System.out.println(c == d);
}

这段代码运行之后打印出的结果一定会让你赶到困惑,请看:

false
true

我们知道,如果两个引用指向同一个对象,那么它们在==.如果两个引用指向不同的对象,那么即使它们具有相同的内容,它们在==方面也不相等。

这实际上是有趣的地方。如果查看Integer.java类,您会发现有一个内部私有类,IntegerCache.java,它缓存-128和127之间的所有Integer对象。

所以问题是,所有的小整数在内部缓存,当我们声明类似以下内容的时候

Integer a = 1000;

它在内部做什么

Integer i = Integer.valueOf(100);

我们来看看Integer.valueOf()这个方法

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

如果整数的值介于-128和127之间,那么将返回缓存中的对象,所以

Integer a = 1000, b = 1000;

是同一个对象。

那么问题来了,为什么这里要使用缓存?

本文分享自微信公众号 - java工会(javagonghui)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-11-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小樱的经验随笔

析构函数的用法【简单理论讲解】

析构函数是“反向”的构造函数。它们在对象被撤消(回收)时调用。析构函数的名 称除了最前面的“~”符号外,与类的名称相同。例如,类String的析构函数是~str...

301110
来自专栏架构之路

动态代理模式原理

在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来...

37240
来自专栏技术之路

c++ 数组

数组就是一组元素的内存位置,各个内存位置可以存储相同数据类型的数据项,而我们可以用相同的变量名引用所有的内存地址 初始化数组 int myA[5]={1,2,3...

21950
来自专栏顶级程序员

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

这是我们今天要讨论的话题,因为我觉得它非常的有趣。 如果你运行如下代码: Integer a = 1000, b = 1000; System.out.pr...

39550
来自专栏java一日一条

一个以前没有注意的问题:java构造函数的执行顺序

昨天在改一处代码时发现执行的过程和预想的不一样,仔细探究才发现是构造器执行顺序问题.(汗自己一下,基础不够扎实) 特地做了一些尝试然后把java构造器的执行顺...

7620
来自专栏java 成神之路

Java 自动装箱与拆箱的实现原理

460170
来自专栏WD学习记录

C#学习笔记(一)

1. 使用#region和#endregion关键字,来定义可以展开和折叠的代码区域的开头和结尾

15420
来自专栏java一日一条

一个以前没有注意的问题:java构造函数的执行顺序

昨天在改一处代码时发现执行的过程和预想的不一样,仔细探究才发现是构造器执行顺序问题.(汗自己一下,基础不够扎实) 特地做了一些尝试然后把java构造器的执行顺...

10110
来自专栏HTML5学堂

2016.01.07 HTML5真题练习

HTML5学堂:每天一道题,强壮程序员!今日主要涉及01.06日,数组操作题目的解答,以及一道涉及数组拼接的题目。 HTML5真题【2016.01.06】答案解...

27850
来自专栏大眼瞪小眼

介绍C语言指针

引用传递是C++才有的特性,C语言只支持值传递。所以C语言只能通过传指针来达到在函数内修改函数外变量的功能。也就是swap(int &a,int &b)在C语言...

29010

扫码关注云+社区

领取腾讯云代金券