[英]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
仍然引用添加到Set
的String
(等於“ hs.remove(s1)
”的String
),因此hs.remove(s1)
從中刪除該String
Set
。
你的問題有很多問題,我認為你應該學習一些基礎知識。
每當您執行新操作時,它都會創建一個新對象。 s1 = new String("Demo");
Hashset適用於對象的hashcode()
和equals()
。 因此,如果您使用自己的類添加到Hashset,請覆蓋這兩種方法。 如需更多學習,請谷歌搜索。
現在針對您的問題,當您通過執行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.