假设有一个数组包含一系列对象,
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和其他论坛上,我读到的解释有点过头了。
答案 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中的原始类型。
答案 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字节码。)