我有一个奇怪的问题,我无法理解为什么会发生这种情况。我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 正在代表您驻留(或缓存)某些引用。具体来说,如果您输入String
s 作为您的类型,您将遇到一些奇怪的字符串实习行为,突然之间,您的列表具有相同的String
. 这是完全可以处理引用的唯一方法==
- 如果它以某种方式被嵌入或缓存并且可以被引用。
这是微不足道的失败;如果您使用的值不能被实习或缓存,那么您将观察到您的测试失败。
例如,new BigInteger("100")
和new BigInteger("100")
在内存中的位置不同,如果将它们都放在列表中并尝试比较等价性,则会得到false
.
添加回答
举报
0/150
提交
取消