ArrayList.get(i)给出了不可靠的结果

时间:2014-06-12 11:19:06

标签: java

我编写了以下代码来确定两个相同大小的数组是否相同:

retVal = true;
for (int i = 0; i < array1.size(); i++) {
    if (array1.get(i) != array2.get(i)){ 
    retVal = false;
    break;
 }
}

在一些无法解释的情况下,if语句返回true,尽管它不是(在调试器中检查)。在其他人中,它给出了正确的结果。 我通过执行以下微不足道的修复来修复它:

int val1, val2;
retVal = true;
for (int i = 0; i < array1.size(); i++) {
   val1 = array1.get(i);
   val2 = array2.get(i);
   if (val1 != val2) {
       retVal = false;
       break;
   }
}

任何想法可能是什么原因?

4 个答案:

答案 0 :(得分:2)

你的阵列是什么? String S'

如果是这样,那么你不能用Java ==来比较字符串。您需要使用equals方法。

所以你的比较将成为:

if (array1.get(i).equals(array2.get(i))) 

如果他们持有其他类型的对象,那么您需要确保如何定义这些对象中的equals方法。

答案 1 :(得分:0)

我们不知道你在比较什么,但在两种情况下都不是一回事。

ArrayLists不能保持整数,所以第一个使用!=来比较两个不是整数的东西。在第二种情况下,代码是自动装箱int的任何内容,你正在比较它的结果。

这是某种特技问题吗?

编辑:我认为ArrayList可能持有整数,并且在第一种情况下,您正在测试位置是否包含相同的Integer对象,而在第二种情况下,它们是否保持相同的整数值。但是我们不知道你是如何声明ArrayLists的,尽管只需要两行来向我们展示。

答案 2 :(得分:0)

这种行为没什么奇怪的。在你的情况下,它完全依赖于arraylist中的输入元素。

通常我们在将Wrapper对象插入集合时依赖于自动装箱。

当你执行list.add(1);Integer i =1;时,使用Integer.valueOf()完成自动装箱,它使用从-127到128(包含)的整数范围的缓存,即返回相同的对象引用此范围内的相同int值。

            Integer a = 2;
            Integer b = 2;      
            System.out.println(a==b); 
           // true as referring same object and not because they have same value

            //for values outside range -127 to 128
            a=200;
            b=200;          

            System.out.println(a==b);
           //false as the two references are pointing different objects now


            System.out.println(a.equals(b));
            //returns true as values are compared
            //same as a.intValue() == b.intValue();

因此,您的代码可能对范围正常工作但在其外部失败!=(因为array1.get(i)将返回Integer引用,如果条件将检查引用相等)
因此,总是更喜欢使用equals()来比较值和对象引用。

  

第二种情况有效,因为整数是隐式取消装箱的,而且= =做了   使用原语进行值检查。

希望它有所帮助。

答案 3 :(得分:0)

  

我编写了以下代码来确定两个相同大小的   数组相同

Ignorantia APIs neminem excusat

您实际上是在比较两个列表。除了通常的==.equals()混淆错误之外,您应该阅读以下内容最感兴趣的API(ArrayList):

  

public boolean equals(Object o)

     

将指定对象与此列表进行比较以获得相等性。的返回   当且仅当指定的对象也是列表时才为true,两个列表都   具有相同的大小,以及两个中所有相应的元素对   列表相同。 (如果(e1 == null?),则两个元素e1和e2相等    e2 == null:e1.equals(e2))。)换句话说,两个列表被定义为   如果它们包含相同顺序的相同元素,则相等。

     

此实现首先检查指定的对象是否为此列表。   如果是,则返回true;如果没有,它会检查指定的对象是否为a   名单。如果不是,则返回false;如果是这样,它会遍历两个列表,   比较相应的元素对。如果任何比较返回   false,此方法返回false。如果任何迭代器耗尽   另一个元素返回false(如列表所示)   不等长);否则它在迭代时返回true   完整。

所以就这样做:list1.equals(list2)然后发光。