我有一個(gè)奇怪的問(wèn)題,我無(wú)法理解為什么會(huì)發(fā)生這種情況。我equals在一個(gè)DoublyLinkedList泛型類中實(shí)現(xiàn)了這個(gè)方法:@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; }在單元測(cè)試中測(cè)試此方法,如下所示:@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))); }告訴我測(cè)試通過(guò)了。但是,如果我在第一個(gè)代碼中使用!=, 而不是equals比較每個(gè)迭代器的實(shí)例,為什么會(huì)發(fā)生這種情況?它不應(yīng)該比較引用,從而失敗嗎?
2 回答

慕沐林林
TA貢獻(xiàn)2016條經(jīng)驗(yàn) 獲得超9個(gè)贊
Java 正在代表您駐留(或緩存)某些引用。具體來(lái)說(shuō),如果您輸入String
s 作為您的類型,您將遇到一些奇怪的字符串實(shí)習(xí)行為,突然之間,您的列表具有相同的String
. 這是完全可以處理引用的唯一方法==
- 如果它以某種方式被嵌入或緩存并且可以被引用。
這是微不足道的失?。蝗绻褂玫闹挡荒鼙粚?shí)習(xí)或緩存,那么您將觀察到您的測(cè)試失敗。
例如,new BigInteger("100")
和new BigInteger("100")
在內(nèi)存中的位置不同,如果將它們都放在列表中并嘗試比較等價(jià)性,則會(huì)得到false
.
添加回答
舉報(bào)
0/150
提交
取消