首先在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???
答案 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)
您的问题存在多个问题,我认为您应该学习一些基础知识。
每当您执行新操作时,它都会创建一个新对象。
s1 = new String("Demo");
Hashset适用于对象hashcode()
和equals()
。因此,如果您使用自己的类添加到Hashset,请覆盖这两种方法。如需更多学习,请谷歌搜索。
现在针对您的问题,当您通过执行创建新对象时
s1 = new String("Demo");
然后尝试通过hs.remove(s1);
从哈希集中删除新对象,hashset将使用方法equals()
和hashcode()
来识别应该的对象被删除。由于这个新对象不存在于hashset中,因此不会删除任何内容。
因此大小没有变化。
答案 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;不一样。 希望这可以解决您的困惑并回答您的问题。