从HashSet中删除元素

时间:2015-04-16 06:41:49

标签: java string 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???

6 个答案:

答案 0 :(得分:8)

String s1 = new String("Keval");     
....
hs.add(s1); 
....
s1 = new String("Demo");        
hs.remove(s1);

您要添加的String等于String&#34; Keval&#34;到HashSet,但您要删除String等于String&#34;演示&#34;来自Set

您的HashSet不包含String等于&#34;演示&#34;,因此remove()调用不会从Set中删除任何内容,也不会删除s1 = new String("Demo")。影响它的大小。

当您移除s1行时,String仍然引用添加到Set的{​​{1}}(等于&#34的那个; Keval& #34;),因此hs.remove(s1)会从String中移除Set

答案 1 :(得分:2)

如果您希望Hashset识别您的对象,则必须覆盖equals和hashcode方法。

因为你添加了&#34; Keval&#34;并试图删除&#34; Demo&#34;设置没有变化。

请记住,因为您正在使用HashSet of Objects,所以在使用hashcode和equals方法时要小心,这可能会产生意想不到的后果。 See this question了解有关此内容的详细信息。

答案 2 :(得分:1)

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

  1. 每当您执行新操作时,它都会创建一个新对象。 s1 = new String("Demo");

  2. Hashset适用于对象hashcode()equals()。因此,如果您使用自己的类添加到Hashset,请覆盖这两种方法。如需更多学习,请谷歌搜索。

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

  4. 因此大小没有变化。

答案 3 :(得分:0)

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

所以它没有从集合

中删除任何东西

答案 4 :(得分:0)

您正在将字符串初始化为 new String ,这将在字符串池中创建新字符串。如果在更改字符串值之前删除它将从哈希集中删除并将大小设置为2(其因为当你添加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());

答案 5 :(得分:0)

HashSet通过计算密钥的哈希码来查找哈希集中的桶/位置。 在hs中添加s1时,你的密钥是&#34; Keval&#34;将生成哈希码和s1对象将存储在该桶中。 现在您已将s1更改为&#34; Demo&#34;。在删除s1时,将根据key&#34; Demo&#34;生成的哈希码搜索bucket。在hs中找不到此存储桶,因此不会将其删除。 &#34; Keval&#34;的哈希码和#34;演示&#34;不一样。 希望这可以解决您的困惑并回答您的问题。