[英]Why isn't my Java LinkedHashSet removing an object it contains?
我在LinkedHashSet
中有一個實現equals
, hashCode
和compareTo
(在超類中)的對象但是當我嘗試從set set.remove(obj)
刪除那個確切的對象時,remove方法返回false
並且對象保留在set中。 LinkedHashSet
的實現是否應該調用其對象的equals()
方法? 因為它沒有。 這可能是一個java bug嗎? 我正在運行1.6.0_25。
我的猜測是你的對象的hashCode()
實現返回的值不同於你將對象添加到集合時的值。
LinkedHashSet
對我來說很好用:
import java.util.*;
public class Test {
public static void main( String[] args ) {
LinkedHashSet<String> lhs = new LinkedHashSet<String>();
String s = "hi";
lhs.add( s );
System.out.println( lhs );
lhs.remove( s );
System.out.println( lhs );
}
}
也許你將一個不同的對象引用傳遞給remove方法? 您確定沒有以任何方式更改引用嗎?
還要確保hashCode()
在您插入時返回相同的值,就像您嘗試刪除它時一樣。
這是LinkedHashSet
中的一個錯誤的可能性是無限小的 。 你應該認為這是對你的問題的合理解釋。
假設這是您的代碼中的錯誤,那么可能是由於許多事情。 例如:
equals
和hashCode
方法正在為對象返回矛盾的答案。 equals
或hashCode
方法依賴於可變字段,並且當對象在集合中時,這些字段正在更改。 (例如,如果哈希碼值發生更改,則該對象可能位於錯誤的哈希鏈上,導致remove
方法無法找到它。) equals
方法聲明為重載,而不是重寫equals(Object)
。 (這可以解釋為什么你的equals
沒有被調用...假設你的斷言是事實上正確的。) 現在,我知道你已經駁回了其中的一些解釋。 但這可能為時過早。 檢查您基於解雇的證據 。
您可以使用的另一種方法是使用Java調試器來法醫檢查數據結構(例如LinkedHashSet
的內部),並單步執行應該發生刪除的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.