我编写了以下代码来确定两个相同大小的数组是否相同:
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;
}
}
任何想法可能是什么原因?
答案 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)
然后发光。