奇怪的Java题:为什么1000 == 1000返回为False,而100 == 100会返回为True?-控件新闻-慧都控件网
这是我们今天要讨论的话题,因为我觉得它非常的有趣。
如果你运行如下代码:
1 2 3 4 | Integer a = 1000, b = 1000; System.out.println(a == b);//1Integer c = 100, d = 100; System.out.println(c == d);//2 |
你会得到以下运行结果:
1 2 | falsetrue |
我们知道,如果两个引用指向同一个对象,那么==就成立;反之,如果两个引用指向的不是同一个对象,那么==就不成立,即便两个引用的内容是一样的。因此,结果就会出现false。
这是非常有趣的地方。如果你查看Integer.java类,你会找到IntegerCache.java这个内部私有类,它为-128到127之间的所有整数对象提供缓存。
这个东西为那些数值比较小的整数提供内部缓存,当进行如此声明时:
1 | Integer c = 100; |
它的内部就是这样的:
1 | Integer i = Integer.valueOf(100); |
如果我们观察valueOf()类函数,我们可以看到
1 2 3 4 5 | public static Integer valueOf(int i) { if (i >= IntegerCache.low && i return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } |
如果值在-128到127之间,它就会返回该缓存的实例。
因此。。。
1 | Integer c = 100, d = 100; |
两者指向同样的对象。
这就是为什么这段代码的结果为true了:
1 | System.out.println(c == d); |
现在你可能会问,为什么会为-128到127之间的所有整数设置缓存?
Read full article from 奇怪的Java题:为什么1000 == 1000返回为False,而100 == 100会返回为True?-控件新闻-慧都控件网
No comments:
Post a Comment