簡體   English   中英

為什么我的Java LinkedHashSet不刪除它包含的對象?

[英]Why isn't my Java LinkedHashSet removing an object it contains?

我在LinkedHashSet中有一個實現equalshashCodecompareTo (在超類中)的對象但是當我嘗試從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中的一個錯誤的可能性是無限小的 你應該認為這是對你的問題的合理解釋。

假設這是您的代碼中的錯誤,那么可能是由於許多事情。 例如:

  • 你的equalshashCode方法正在為對象返回矛盾的答案。
  • 您的equalshashCode方法依賴於可變字段,並且當對象在集合中時,這些字段正在更改。 (例如,如果哈希碼值發生更改,則該對象可能位於錯誤的哈希鏈上,導致remove方法無法找到它。)
  • 您已將equals方法聲明為重載,而不是重寫equals(Object) (這可以解釋為什么你的equals沒有被調用...假設你的斷言是事實上正確的。)
  • 您要刪除的對象(實際上)不是您插入的對象。
  • 其他東西已經刪除了該對象。
  • 您正在運行某個類的不同版本,該類與您正在檢查的源代碼不匹配。

現在,我知道你已經駁回了其中的一些解釋。 但這可能為時過早。 檢查您基於解雇的證據

您可以使用的另一種方法是使用Java調試器來法醫檢查數據結構(例如LinkedHashSet的內部),並單步執行應該發生刪除的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM