我遇到一个奇怪的问题,我无法理解为什么会发生这种情况。
我在equals
通用类中实现了此DoublyLinkedList
方法:
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (getClass() != obj.getClass() || obj == null) {
return false;
}
DoublyLinkedList<E> other = (DoublyLinkedList<E>) obj;
if (this.size != other.size) {
return false;
}
Iterator<E> iterator = this.iterator();
Iterator<E> otherIterator = other.iterator();
while(iterator.hasNext()){
if(iterator.next() != otherIterator.next()){
return false;
}
}
return true;
}
在单元测试中测试此方法,如下所示:
@Test
public void testEquals() {
System.out.println("equals");
DoublyLinkedList <String> instance1 = new DoublyLinkedList <>(), instance2 = new DoublyLinkedList <>();
instance1.addLast("Xpto");
instance1.addLast("Ypto");
instance1.addLast("Zpto");
instance2.addLast("Xpto");
assertFalse("Lists should not be equal", (instance1.equals(instance2)));
assertFalse("Lists should not be equal", (instance2.equals(instance1)));
instance2.addLast("Ypto");
assertFalse("Lists should not be equal", (instance1.equals(instance2)));
assertFalse("Lists should not be equal", (instance2.equals(instance1)));
instance2.addLast("Zpto");
assertTrue("Lists should be equal", (instance1.equals(instance2)));
assertTrue("Lists should be equal", (instance2.equals(instance1)));
}
告诉我测试通过了。但是,如果在第一个代码中使用!=
而不是equals
来比较每个迭代器的实例,为什么会发生这种情况?它不应该比较引用,从而失败吗?
谢谢!
答案 0 :(得分:2)
Java代表您驻留(或缓存)某些引用。具体来说,如果您输入String
作为类型,您将遇到一些奇怪的String插入行为,即突然之间,您的列表具有与String
相同的引用。这是==
完全可以在引用上工作的 方式-如果以某种方式对其进行了interinter或缓存并可以引用。
这很容易被击败;如果您使用的值不能被求值或缓存,那么您会发现测试失败。
例如,new BigInteger("100")
和new BigInteger("100")
在内存中的位置不同,如果将它们都放在列表中并尝试比较等效项,则会得到false
。
答案 1 :(得分:1)
那是因为它们指向内存中的相同位置。
请参阅:https://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#d5e1634