猿问

测试等于方法

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


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


慕妹3146593
浏览 136回答 2
2回答

慕沐林林

Java 正在代表您驻留(或缓存)某些引用。具体来说,如果您输入Strings 作为您的类型,您将遇到一些奇怪的字符串实习行为,突然之间,您的列表具有相同的String.&nbsp;这是完全可以处理引用的唯一方法==- 如果它以某种方式被嵌入或缓存并且可以被引用。这是微不足道的失败;如果您使用的值不能被实习或缓存,那么您将观察到您的测试失败。例如,new BigInteger("100")和new BigInteger("100")在内存中的位置不同,如果将它们都放在列表中并尝试比较等价性,则会得到false.
随时随地看视频慕课网APP

相关分类

Java
我要回答