当前位置: 首页 > 科技观察

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

时间:2023-03-12 13:26:48 科技观察

这是一个非常有趣的讨论话题。如果运行下面的代码Integera=1000,b=1000;System.out.println(a==b);//1Integerc=100,d=100;System.out.println(c==d);//2你会得到falsetrue基础知识:我们知道如果两个引用指向同一个对象,用==表示相等。如果两个引用指向不同的对象,使用==表示它们不相等,即使它们的内容相同。因此,后一种说法也应该是错误的。这就是它变得有趣的地方。如果你看Integer.java类,你会发现内部有一个私有类IntegerCache.java,它缓存了-128到127的所有整数对象。所以事情是这样的,所有的小整数都缓存在内部,并且然后当我们声明类似--Integerc=100;的东西时,它实际上在内部做的是Integeri=Integer.valueOf(100);现在,如果我们去查看valueOf()方法,我们可以看到publicstaticIntegervalueOf(inti){if(i>=IntegerCache.low&&ireturnIntegerCache.cache[i+(-IntegerCache.low)];returnnewInteger(i);}如果值范围从-128到127之间,它从缓存中返回实例。所以...Integerc=100,d=100;指向同一个对象。这就是为什么我们写System.out.println(c==d);我们可以得到true。现在为什么这里需要缓存,你可能会问?合乎逻辑的原因是这个范围内的“小”整数比大整数使用得更多,所以使用相同的底层对象来减少潜在的内存是有价值的已占用。但是,通过反射API,您会滥用此功能。运行下面的代码,享受它的魅力publicstaticvoidmain(String[]args)throwsNoSuchFieldException,IllegalAccessException{Classcache=Integer.class.getDeclaredClasses()[0];//1FieldmyCache=cache.getDeclaredField("cache");//2myCache。setAccessible(true);//3Integer[]newCache=(Integer[])myCache.get(cache);//4newCache[132]=newCache[133];//5inta=2;intb=a+a;System.out.printf("%d+%d=%d",a,a,b);//}翻译链接:http://www.codeceo.com/article/why-java-1000-100.html英文原文:为什么1000==1000返回False,而100==100在Java中返回True?