从 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
,但您正试图删除等于 String
的 String
从 Set
.
到 String
"Demo"
您的 HashSet
不包含等于 "Demo" 的 String
,因此 remove()
调用不会从 Set
中删除任何内容,并且不会影响其尺寸。
当您删除 s1 = new String("Demo")
行时,s1
仍然引用添加到 Set
的 String
(等于 "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 上的对象。
所以它没有从集合中删除任何东西
你的问题有多个问题,我认为你应该学习一些基础知识。
只要你做一个新的,它就会创建一个新的对象。
s1 = new String("Demo");
Hashset 适用于对象的 hashcode()
和 equals()
。因此,如果您使用自己的 class 添加到 Hashset,请重写这两个方法。更多学习请google他们
现在解决你的问题,当你创建一个新对象时
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" 的哈希码不同。
希望这能消除您的困惑并回答您的问题。
首先在 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
,但您正试图删除等于 String
的 String
从 Set
.
String
"Demo"
您的 HashSet
不包含等于 "Demo" 的 String
,因此 remove()
调用不会从 Set
中删除任何内容,并且不会影响其尺寸。
当您删除 s1 = new String("Demo")
行时,s1
仍然引用添加到 Set
的 String
(等于 "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 上的对象。
所以它没有从集合中删除任何东西
你的问题有多个问题,我认为你应该学习一些基础知识。
只要你做一个新的,它就会创建一个新的对象。
s1 = new String("Demo");
Hashset 适用于对象的
hashcode()
和equals()
。因此,如果您使用自己的 class 添加到 Hashset,请重写这两个方法。更多学习请google他们现在解决你的问题,当你创建一个新对象时
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" 的哈希码不同。 希望这能消除您的困惑并回答您的问题。