当前位置:职场发展 > 为什么Java中“1000==1000”为假而“100==100”为真?

为什么Java中“1000==1000”为假而“100==100”为真?

  • 发布:2023-10-06 14:27

这是一个非常有趣的讨论话题。

如果您运行以下代码:

整数a = 1000, b = 1000; 
System.out.println(a == b);//1
整数 c = 100, d = 100;
系统.out.println(c == d);//2

您将得到:



基础知识:我们知道,如果两个引用指向同一个对象,==表示它们相等。如果两个引用指向不同的对象,则使用 == 来表明它们不相等,即使它们的内容相同。

因此,以下说法也应该是错误的。

这就是有趣的地方。如果你查看 Integer.java 类,你会发现有一个内部私有类 www.sychzs.cn,它缓存 所有介于 -128 和 127 之间的整数对象。

所以发生的情况是,所有小整数都会在内部缓存 ,然后当我们声明类似的内容时 -

整数 c = 100;

,它内部实际上做的是

整数 i = Integer.valueOf(100);

现在,如果我们查看 valueOf() 方法,我们可以看到:

public 静态 整数 valueOf(inti) {
如果 ( i >= IntegerCache.low && i
return IntegerCache.cache[i + (-IntegerCache.low)];
return 整数 (i);
}

如果值在-128到127范围内,则从缓存中返回实例。

所以…

整数 c = 100,d = 100;

指向同一个对象。

这就是我们写

的原因
System.out.println(c == d);

我们可以实现。

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

逻辑原理是,此范围内的“小”整数比大整数使用更频繁,因此使用相同的底层对象来减少潜在的内存占用是有价值的。

但是,通过反射 API,您将滥用此功能。

运行下面的代码,享受它的魅力!

public static void main(字符串[]参数) 抛出NoSuchFieldException、IllegalAccessException {

类缓存=整数.class.getDeclaredClasses()[0];//1
字段 myCache = 缓存。 getDeclaredField("缓存"); //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); //
}

如果这篇文章对您有帮助,请不要吝啬点赞,谢谢!

来源:互联网


后端专属技术组

打造高品质的技术交流社区。欢迎从事编程开发、技术招聘的HR人员加入。也欢迎大家分享自己公司的内部推荐信息,互相帮助,共同进步!

相关文章