为什么Java中1000==1000为false而100==100为true?

这是一个挺有意思的讨论话题。

如果你运行下面的代码

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; 

指向了同一个对象。

这就是为什么我们写:

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

我们可以得到true。

现在你可能会问,为什么这里需要缓存?

合乎逻辑的理由是,在此范围内的“小”整数使用率比大整数要高,因此,使用相同的底层对象是有价值的,可以减少潜在的内存占用。

然而,通过反射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); // 
} 

原文发布于微信公众号 - Java后端技术(JavaITWork)

原文发表时间:2016-10-19

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏鸿的学习笔记

函数式编程阅读笔记

当我们要从一个不可变的list里删除元素或者添加元素怎么办?当增加元素时,你取出来的值的引用就是在原始表中增加元素,而不去修改原来的数据结构。也就是复用。

771
来自专栏数据结构与算法

P3370 【模板】字符串哈希

题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字、大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串。 友情提醒:如果真...

2924
来自专栏iKcamp

全本 | iKcamp翻译 | 《JavaScript 轻量级函数式编程》|《你不知道的JS》姊妹篇

原文地址:Functional-Light-JS 原文作者:Kyle Simpson - 《You-Dont-Know-JS》作者 本书主要探索函数式编程[1]...

32510
来自专栏阿凯的Excel

Python读书笔记(数字型数据)

Python与其它编程语言一样,常见的数字型无法整型(int)和浮点型两种(Float)两种。 整型就是整数,浮点型就是小数。 如果在Python中输入一个数字...

3745
来自专栏潇涧技术专栏

Python Data Structures - C2 Sort

参考内容: 1.Problem Solving with Python Chapter5: Search and Sorting online_link ...

871
来自专栏chenjx85的技术专栏

leetcode-35- Search Insert Position

2153
来自专栏C#

关于.NET参数传递方式的思考

    年关将近,整个人已经没有了工作和写作的激情,估计这个时候很多人跟我差不多,该相亲的相亲,该聚会喝酒的聚会喝酒,总之就是没有了干活的心思(我有很多想...

2329
来自专栏Python小屋

Pythonic:递归、回溯等5种方法生成不重复数字整数

问题描述:从0到9这10个数字任选3个不重复的数字,能构成哪些三位数? So easy!看到这样的问题,很多人会写出类似(注意,只是类似,我为了使得本文几个函...

3947
来自专栏智能算法

Python学习(七)---- 面向对象学习(类)

原文地址: https://blog.csdn.net/fgf00/article/details/52449707 编辑:智能算法,欢迎关注!

1302
来自专栏华章科技

从Zero到Hero,一文掌握Python关键代码

首先,什么是 Python?根据 Python 创建者 Guido van Rossum 所言,Python 是一种高级编程语言,其设计的核心理念是代码的易读性...

803

扫码关注云+社区

领取腾讯云代金券