跳至内容
深圳市捷比信实业有限公司 · 产品选型与采购咨询联系业务人员
捷比信电阻高精密 · 大功率无感 · 金属膜电阻

为什么在Java中“ 1000 == 1000”为假,并且“ 100 == 100”是真的?

来自:Codeceo.com的翻译链接:http://www.codeceo.com/article/why-java-1000-100.html英文原件:https://dzone.com/articles/why-1000-1000-returns -false-but-100-100-returns-tr为什么在Java中“ 1000 == 1000”为假,并且“ 100 == 100”是真的?这是一个有趣的讨论话题。如果运行以下代码:整数a = 1000,b = 1000; System.out.println(a == b); // 1整数c = 100,d = 100; System.out.println(c == d); // 2您将得到false true。基础知识:我们知道,如果两个引用指向同一个对象,请使用==表示它们相等。如果两个引用指向不同的对象,则即使它们的内容相同,也请使用==表示它们不相等。因此,后面的陈述也应该是错误的。这是有趣的地方。如果查看Integer.java类,您会发现有一个内部私有类IntegerCache.java,它缓存-128到127之间的所有整数对象。所以,所有小整数都在内部缓存,然后当我们声明类似Integer c = 100;之类的东西时,它实际上在内部执行的操作是:Integer i = Integer.valueOf(100);现在,如果我们看一下valueOf()方法,我们可以看到公共静态Integer valueOf(int i){if(i> = IntegerCache.low& i return IntegerCache.cache [i +(-IntegerCache.low)]; return new Integer(i);如果值范围在-128到127之间,它将从缓存中返回该实例。So ... Integer c = 100,d = 100;指向同一个对象。我们为什么要写System.out .println(c == d);现在您可能会问,为什么这里需要缓存?逻辑原因是在此范围内“小”整数的使用率更高因此,使用相同的基础对象很有价值,并且可以减少潜在的内存使用。但是,您将通过反射API滥用此功能。运行以下代码,并享受其魅力public static void main(String [] args)抛出NoSuchFieldException,IllegalAccessException {Class cache = Integer.class.getDeclaredClasses()[0]; // 1字段myCache = cache.getDeclaredField(“ cache”)); // 2 my Cache.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); // } - - -结尾 - - -