我有一個奇怪的問題,我無法理解為什么會發生這種情況。我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
提交
取消