测试等于方法

时间:2018-10-05 18:23:58

标签: java

我遇到一个奇怪的问题,我无法理解为什么会发生这种情况。

我在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来比较每个迭代器的实例,为什么会发生这种情况?它不应该比较引用,从而失败吗?

谢谢!

2 个答案:

答案 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