为了账号安全,请及时绑定邮箱和手机立即绑定

测试等于方法

测试等于方法

慕妹3146593 2021-10-28 16:35:59
我有一个奇怪的问题,我无法理解为什么会发生这种情况。我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;    }在单元测试中测试此方法,如下所示:@Testpublic 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 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

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

这是微不足道的失败;如果您使用的值不能被实习或缓存,那么您将观察到您的测试失败。

例如,new BigInteger("100")new BigInteger("100")在内存中的位置不同,如果将它们都放在列表中并尝试比较等价性,则会得到false.


查看完整回答
反对 回复 2021-10-28
  • 2 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信