从 HashSet 中移除元素

Remove element from HashSet

首先在 HashSet 中添加元素并按预期打印 returns 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);

您正在向 HashSet 添加等于 String "Keval" 的 String,但您正试图删除等于 StringStringSet.

String "Demo"

您的 HashSet 不包含等于 "Demo" 的 String,因此 remove() 调用不会从 Set 中删除任何内容,并且不会影响其尺寸。

当您删除 s1 = new String("Demo") 行时,s1 仍然引用添加到 SetString(等于 "Keval"), 所以 hs.remove(s1)Set.

中删除 String

如果您想让Hashset 识别您的对象,您将不得不重写equals 和hashcode 方法。

自从您添加了 "Keval" 并尝试删除 "Demo" 之后,没有要设置的更改。

请记住,由于您使用的是 HashSet of Objects,因此在使用 hashcode 和 equals 方法时要小心,它们可能会产生意想不到的后果。 See this question 了解更多详情。

执行 s1 = new String("Demo") 后,引用 s1 只是引用新对象,而不是 HashSet 上的对象。

所以它没有从集合中删除任何东西

你的问题有多个问题,我认为你应该学习一些基础知识。

  1. 只要你做一个新的,它就会创建一个新的对象。 s1 = new String("Demo");

  2. Hashset 适用于对象的 hashcode()equals()。因此,如果您使用自己的 class 添加到 Hashset,请重写这两个方法。更多学习请google他们

  3. 现在解决你的问题,当你创建一个新对象时 s1 = new String("Demo"); 然后尝试通过 hs.remove(s1); 从 hashset 中删除 new 对象,hashset 将使用方法 equals()hashcode() 来识别应删除的对象。由于哈希集中不存在这个新对象,因此不会删除任何内容。

因此尺寸不变。

您正在将字符串初始化为 new String,这将在您删除的字符串 pool.If 中创建一个新字符串,然后更改将从哈希集中删除的字符串值,并且将大小设为两个(这是因为当您添加 hs.remove 时,s1 值是 "Demo" 而不是 "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通过计算key的hashcode在hashset中找到bucket/location。 在 hs 中添加 s1 时,您的密钥是 "Keval" ,这将生成一个哈希码,并且 s1 对象将存储在该存储桶中。 现在您已将 s1 更改为 "Demo"。删除 s1 时,将根据键 "Demo" 生成的哈希码搜索存储桶。在 hs 中找不到此存储桶,因此未删除。 "Keval" 和 "Demo" 的哈希码不同。 希望这能消除您的困惑并回答您的问题。