簡體   English   中英

從HashSet中刪除元素

[英]Remove element from HashSet

首先在HashSet中添加元素並打印HashSet的大小,該大小按預期返回。 但我修改了一個對象值並再次存儲到HashSet並使用對象名稱刪除對象。 但我仍然和以前一樣大小。 我的代碼如下:

public class Test {

    private String s;
    public Test(String s){
        this.s  = s ;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        HashSet<Object> hs = new HashSet<Object>();
        Test t1 = new Test("Keval");
        Test t2 = new Test("Keval");

        String s1 = new String("Keval");        

        hs.add(t1);
        hs.add(t2);
        hs.add(s1);     
        System.out.println("Set Size :: " + hs.size());

        s1 = new String("Demo");        
        hs.remove(s1);
        System.out.println("Set Size :: " + hs.size());


    }
}

上述代碼的輸出是:

Set Size :: 3
Set Size :: 3    // Why it prints 3 insted of 2???
String s1 = new String("Keval");     
....
hs.add(s1); 
....
s1 = new String("Demo");        
hs.remove(s1);

要添加String等於該String “Keval”你HashSet ,但是你想刪除一個String等於String從“演示” Set

您的HashSet包含等於“Demo”的String ,因此remove()調用不會從Set刪除任何內容,也不會影響其大小。

刪除s1 = new String("Demo")行時, s1仍然引用添加到SetString (等於“ hs.remove(s1) ”的String ),因此hs.remove(s1)從中刪除該String Set

如果希望Hashset標識對象,則必須覆蓋equals和hashcode方法。

由於您添加了“Keval”並嘗試刪除“Demo”,因此無需更改設置。

請記住,因為您正在使用HashSet of Objects,所以在使用hashcode和equals方法時要小心,這可能會產生意想不到的后果。 有關詳細信息, 請參閱此問題

你的問題有很多問題,我認為你應該學習一些基礎知識。

  1. 每當您執行新操作時,它都會創建一個新對象。 s1 = new String("Demo");

  2. Hashset適用於對象的hashcode()equals() 因此,如果您使用自己的類添加到Hashset,請覆蓋這兩種方法。 如需更多學習,請谷歌搜索。

  3. 現在針對您的問題,當您通過執行s1 = new String("Demo");創建新對象時s1 = new String("Demo"); 然后嘗試通過hs.remove(s1);從hashset中刪除該對象hs.remove(s1); ,hashset將使用equals()hashcode()來標識應該刪除的對象。 由於這個新對象不存在於hashset中,因此不會刪除任何內容。

因此,大小是不變的。

在執行s1 = new String("Demo") ,引用s1只是引用新對象而不是HashSet上的對象。

所以它不會從集合中移除任何東西

您正在將字符串初始化為新字符串 ,它將在字符串池中創建新字符串。如果在更改字符串值之前刪除它將從哈希集中刪除並將大小設置為2(因為當您添加hs.remove ,s1值是“演示”不是“keval”。

    String s1 = new String("Keval");  
    hs.add(t1);
    hs.add(t2);
    hs.add(s1);     
    System.out.println("Set Size :: " + hs.size());  //3
    s1 = new String("Demo"); 
    hs.remove(s1);   //equals() method fails to find Demo and none of the element will be removed
    System.out.println("Set Size :: " + hs.size());

HashSet通過計算密鑰的哈希碼來查找哈希集中的桶/位置。 在hs中添加s1時,你的密鑰是“Keval”,它將生成一個哈希碼,s1對象將存儲在該桶中。 現在您已將s1更改為“Demo”。 在刪除s1時,將根據密鑰“Demo”生成的哈希碼搜索bucket。 在hs中找不到此存儲桶,因此不會將其刪除。 “Keval”和“Demo”的哈希碼不相同。 希望這可以解決您的困惑並回答您的疑問。

暫無
暫無

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

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