java - 测试等于方法

标签 java

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

我在 DoublyLinkedList 泛型类中实现了这个 equals 方法:

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

提前致谢!

最佳答案

Java 正在代表您保留(或缓存)某些引用。具体来说,如果您输入 String 作为类型,您将遇到一些奇怪的字符串驻留行为,突然间,您的列表具有与 String 相同的引用。这是 == 对引用起作用的唯一方式 - 如果它以某种方式被保留或缓存并且可以被引用。

打败这个是微不足道的;如果您使用无法保留或缓存的值,那么您会发现测试失败。

例如,new BigInteger("100")new BigInteger("100") 在内存中的位置不同,如果您将这两者都放在在您的列表中并尝试比较等效性,您将得到 false

关于java - 测试等于方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52671321/

相关文章:

java - 适用于 iOS 和 Android 平台的跨平台 appium 代码

java - Core Java 中的绘制形状示例未出现在框架中

java - 使用 split 对输入进行标记

java - 正确设置指针

java - 在 Java 中匹配 2 个问答游戏的问题和答案的数组列表

java - 如何对 rss feed 标题使用 indexOf 操作

java - 仅报告 mapReduce 作业的映射器中的 k 个最低值

java - 替换 GridBagLayout 中的组件

java - TomEE : javax. servlet.ServletException : java. lang.NoClassDefFoundError : Could not initialize class javax. ws.rs.core.UriBuilder

java - Mockito mock() 和调用记录