[英]How set is working for duplicates entry and remove operations in java
我寫了下面的代碼
class Test {
public static void main(String... args) throws Exception{
Set<Integer> s = new HashSet();
Integer i1 = new Integer(1);
s.add(i1);
Integer i2 = new Integer(2);
s.add(i2);
i1 = 5;
s.remove(i1);
System.out.println("size= "+s.size());
}
}
輸出2
我在set
添加了兩個整數( i1
和i2
),並修改了i1
。 當s.remove(i1)
存在時,輸出為2
當我注釋掉s.remove(i1)
仍然輸出為2。
為什么會這樣呢?它是如何在后台運行的。
提前致謝!
Integer
對象是不可變的對象,因此對它們的任何更改都會創建一個新對象。 所以當你改變
i1 = 5;
存儲在集中的原始i1
不會更改。 由於i1現在擁有另一個對象的引用,而該對象在Set中不存在,因此調用
s.remove(i1);
將無效,即它不會刪除任何東西,並且集合的大小仍為2。要確認remove
是否刪除了任何東西,可以使用remove
方法的布爾返回值。 如果刪除該值,它將返回true。 所以試試這個:
if(s.remove(i1)) {
System.out.println("i1 removed");
} else {
System.out.println("i1 NOT removed");
}
這條線
i1 = 5;
實際上被編譯為
i1 = Integer.valueOf(5);
因此,執行后, i1
持有另一個(新)引用,其值不在HashSet
,因此不會刪除任何內容。
i1 = 5;
=>實際上是i1 = Integer.ValueOf(5)
=>這意味着i1
新值 。 (i1 = 5)
,將不會有任何結果。 來源...有效的Java作者:Joshua Bloch
Java中的集合(集合是一個集合)使用'equals()'方法,而不使用'='引用運算符。 也就是說,當您設置“ i1 = 5”,然后設置“ s.remove(i1)”時,remove方法將與所有元素進行比較。
a)從第一個開始:5等於1? 不,所以不要刪除該元素。
b)第二個:5等於2? 不,所以不要刪除該元素。
在空集上添加重復項的操作相同:
i1=1;
i2=1;
s.add(i1);
s.add(i2)
這將在僅包含1個元素的集合上得出結果,因為'i1.equals(i2)'為true,而'i1 = i2'不是true則無關緊要。
區分對象和參考變量非常重要。 包含引用變量的引用表達式為null或指向某個對象的指針。
HashSet包含自己的指向其表示的對象集中的指針。 通過代碼工作:
Set<Integer> s = new HashSet();
// s is a pointer to a new, empty, HashSet.
Integer i1 = new Integer(1);
// i2 is a pointer to an Integer object with value 1
s.add(i1);
// The set contains one Integer object, value 1
Integer i2 = new Integer(2);
s.add(i2);
// The set contains two Integer objects, values 1 and 2
i1 = 5;
// i1 is a pointer to an Integer object with value 5
s.remove(i1);
// The set does not contain any object that is equal
// to an Integer with value 5 so it is unchanged
例如,在執行“ i1 = 5;”之后,i1開始指向另一個地址。 而且它與存儲在HashSet中的Integer不再相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.