在增强的for循环中使用equals()和==

时间:2014-10-25 04:25:26

标签: java arrays foreach

假设有一个数组包含一系列对象,

 Object[] list;

和设计用于迭代此数组的方法,例如

public boolean contains(Object e)
{
    for(Object e_:list)
        if(e_.equals(e))
            return true;
    return false;
}

我很困惑的是for循环如何迭代数组。迭代时,它是否将e_分配给与list [index]相同的内存位置,或者e_是从list [index]克隆的新对象,因为我想要做的是使用==而不是equals()以便我可以具体使用调用该对象,而不是冒险将它与另一个对等。我理解我可以覆盖equals()并使其成为最终以防止继承成为一个问题,但我想了解迭代是如何工作的。你最好用外行的方式回答,而不仅仅是把我送到另一个网站,因为我一直在oracle和其他论坛上,我读到的解释有点过头了。

4 个答案:

答案 0 :(得分:6)

Java中很少有任何克隆。 Java中的赋值(=)运算符不会克隆对象。 A = B将参考A设置为与B相同的值。因此(A == B)为真。将对象放入列表/数组时,不会克隆对象。当您遍历数组时,它与您放在那里的参考值相同。

答案 1 :(得分:2)

  

我很困惑的是for循环如何迭代数组。什么时候   迭代,它是否将e_分配给相同的内存位置   list [index]或者是e_从列表[index]

克隆的新对象
Object[] someList = {...};
for(Object e:someList) {
}

简单地说,Object中的每个someList都将其分配给变量e

  

...因为我想要做的是使用==而不是equals()以便我可以   专门调用该对象,而不是冒着与另一个对等的风险。

比较对象时,必须提供对象的equals()方法的自己的实现。使用==来比较对象的相等性可能会返回意外结果。请注意==只是比较对象的参考地址以确定它们是否相等。它通常仅用于比较Java中的原始类型。

Read more about the equals() method and == operator here.

答案 2 :(得分:0)

==将检查引用是否相等,即是否指向同一对象。然而,equals将检查对象内容的相等性,前提是在您使用的类中重写了它。

答案 3 :(得分:0)

增强的for循环可以迭代集合(或任何实现Iterable)或数组的集合。在Iterable的情况下,它是通过从对象获取Iterator并重复调用其hasNext()next()方法来实现的,但您感兴趣的是阵列。

在数组的情况下,它获取数组的长度,将索引初始化为0,然后重复递增索引,每次从数组中查找项目,直到索引大于或等于数组的长度。

换句话说,它相当于循环:

for (int i = 0; i < array.length; i++) {
    Object e_ = array[i];
}

因此,分配给e_的对象是数组中的实际对象(引用,即),而不是克隆或新创建的对象。顺便说一下,迭代集合也是如此,因为迭代器的next()方法将返回集合中的引用,而不是克隆或副本。

因此,如果e是放入数组的实际对象,并且不仅可以预期将equals()与数组中的一个进行比较,将它们比作e_ == e是安全的。

(注意:您可以通过阅读Java Language Specification或者,如果您没有那种耐心,通过编译一个简单的程序然后查看它的反汇编来了解实现。 javap -v ClassName,虽然这需要学习Java字节码。)