java中的整数文字

Integer i1 = 127; Integer i2 = 127; if(i1==i2){ System.out.println("true"); //prints true }else{ System.out.println("false"); } Integer i3 = 128; Integer i4 = 128; if(i3==i4){ System.out.println("true"); }else{ System.out.println("false"); //prints false } 

为什么如果Integer值小于127,则返回true,否则返回false。如果是原始值,则返回true。

或者如果我创建Integer i2 = new Integer(1); 这总是返回false。

您正在检查身份。 Java保留一个整数池,介于-128和127之间。其他整数是动态创建的,因此它们彼此不同。 正如@ sarwar026所说,你应该使用.equals()

你应该使用.equals()而不是== 。 在这种情况下,您的两个代码都应该打印为true

 if(i1.equals(i2)){ System.out.println("true"); }else{ System.out.println("false"); } 

使用i1.equals(i2)与Integer进行比较

为什么

因为当您使用==比较两个整数时,则比较参考对象而不是值。 但是当你使用equals方法比较它们时,他们正在比较这些值

但是,为什么之前有效呢

正如Elazar已经建议的那样,java使用256(-128到127)长整数池。 pool表示所有已定义的int都存储在某个“池”中。 所以对于整数池的值,它返回true。 但是,对于更大的值,动态创建整数,因此它不显示为真。

什么关于原始int

在原始类型中,没有像上面那样的复杂性。 所以你总是可以使用==来比较两个原语

使用Integer.equals()方法检查值是否相等。 这是因为高达128的值被缓存。 因此,JVM为您提供相同的对象,从而对象进行比较。 但是大于128的值会在不使用缓存的情况下创建新实例。

首先,我们需要通过equals()检查,以便在引用的情况下比较值。 但是通过“==”,它会比较引用而不是它保留的值。

如果您在Integer类中执行以下方法,则可以了解。

 public static Integer valueOf(int i) { assert IntegerCache.high >= 127; if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } 

所以当值大于127时,它没有采用相同的参考。 因此在第二种情况下结果是错误的。