JAVA:当Integer大于128时,比较不起作用

时间:2012-04-19 07:35:34

标签: java integer

这是我的Java程序的一部分,我已经拿出并简化为测试。任务是比较ArrayList中的两个整数,并说明它们是否相等。

以下代码适用于数字<128但任何数字&gt; 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<Integer> proceedArray = new ArrayList<Integer>();


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");
}




}
}

3 个答案:

答案 0 :(得分:6)

是的,这是预期的。您不应将对象引用与==!=进行比较。您应该使用.equals(..)代替或更好 - 使用原语int而不是Integer

问题是,高达128的值被缓存,JVM为您提供相同的对象(因此参考比较有效)。在128以上它创建了一个新实例。看看Integer.valueOf(int)的javadoc(这是幕后发生的事情)

  

返回表示指定int值的Integer实例。如果不需要新的Integer实例,通常应优先使用此方法,而不是构造函数Integer(int),因为此方法可能通过缓存频繁请求的值来显着提高空间和时间性能。

答案 1 :(得分:0)

在比较Java中的对象时,实际上在使用==相等运算符时比较引用而不是值。相反,您应该使用方法.equals()来比较值;

Integer a = 2423;
Integer b = 5455;

if (a.equals(b)) { ...

答案 2 :(得分:0)

您使用Integer对象而不是int primitive作为变量类型。这只适用于'='运算符,最大值为128,因为java会缓存它。比较对象的正确方法是.equals()函数。

但请改用原始值。

int i1 = 1;
int 12 = 2;
List<Integer> values = ArrayList<Integer>();
if (!values.contains(i1)) {
 values.add(i); 
}
if (!values.contains(i2)) {
 values.add(i2); 
}