JAVA:当Integer大于128时,比较不起作用
这是我的Java程序的一部分,我已经拿出并简化了测试。 任务是比较ArrayList中的两个整数并说明它们是否相等。
以下代码适用于数字 128且代码不起作用。
任何帮助都会非常棒,谢谢。
import java.util.*; public class test { public static void main (String[] args) { Integer seat1Store = 128; Integer seat2Store = 128; Integer seat3Store = 0; Integer seat4Store = 0; Integer seat5Store = 0; ArrayList proceedArray = new ArrayList(); if (seat1Store !=0) { proceedArray.add(seat1Store); } if (seat2Store !=0) { proceedArray.add(seat2Store); } if (seat3Store !=0) { proceedArray.add(seat3Store); } if (seat4Store !=0) { proceedArray.add(seat4Store); } if (seat5Store !=0) { proceedArray.add(seat5Store); } System.out.println("ArrayList = " + proceedArray); boolean proceed = false; for(int i = 0; i<proceedArray.size();i++) { for(int p=0; p<proceedArray.size(); p++) { if(i != p) { if(proceedArray.get(i) == proceedArray.get(p)) { System.out.println("DUPLICATE"); System.exit(0); } } } proceed = true; } if (proceed == true) { System.out.println("PROCEEDED"); } } }
是的,这是预料之中的。 您不应该将对象引用与==
或!=
进行比较。 您应该使用.equals(..)
代替或更好 – 使用原始int
而不是Integer
。
问题是,高达128的值被缓存,JVM为您提供相同的对象(因此参考比较有效)。 在128以上它创建了一个新实例。 查看Integer.valueOf(int)
的javadoc(这是场景背后发生的事情)
返回表示指定int值的Integer实例。 如果不需要新的Integer实例,通常应优先使用此方法,而不是构造函数Integer(int),因为此方法可能通过缓存频繁请求的值来显着提高空间和时间性能。
在比较Java中的对象时,实际上在使用==相等运算符时比较引用而不是值。 相反,您应该使用方法.equals()
来比较值;
Integer a = 2423; Integer b = 5455; if (a.equals(b)) { ...
您使用Integer对象而不是int primitive作为变量类型。 这只适用于’=’运算符,最大值为128,因为java会缓存它。 比较对象的正确方法是.equals()函数。
但是改用原始值。
int i1 = 1; int 12 = 2; List values = ArrayList (); if (!values.contains(i1)) { values.add(i); } if (!values.contains(i2)) { values.add(i2); }