奇怪的Java题:为什么1000 == 1000返回为False,而100 == 100会返回为True?

发布时间:2024-11-21 07:38

熊孩子问:‘为什么我要学习?’大人回答:‘为了长大后能问出更多奇怪的问题。’ #生活乐趣# #日常生活趣事# #日常生活笑话# #幽默故事推荐#

这是我们今天要讨论的话题,因为我觉得它非常的有趣。

如果你运行如下代码:

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); // }

本文翻译自dzone.com,由回忆和感动翻译,转载请注明文章来自慧都控件网。

标签:Java

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com


网址:奇怪的Java题:为什么1000 == 1000返回为False,而100 == 100会返回为True? https://www.yuejiaxmz.com/news/view/170408

相关内容

为什么1000 == 1000返回为False,而100 == 100会返回为True?
为什么Java中“1000==1000”为false,而”100==100“为true?
python if是如何判断true或False的呢? is和== 有什么区别呢?
用Response.Buffer=True为程序加速
9.回文数
Java=NIO,AIO详解
{} == {},[]==[] 结果为什么是false?
基于Java的校园二手书交易平台设计与实现(源码+lw+部署文档+讲解等)
JAVA题目
Java——String类

随便看看