簡體   English   中英

set如何用於重復項輸入和Java中的刪除操作

[英]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添加了兩個整數( i1i2 ),並修改了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 ,因此不會刪除任何內容。

  1. Java基本類型只能有VALUES
  2. Java盒裝類型具有VALUEIDENTITY
  3. 兩種Java裝箱類型可以具有相同的VALUE但具有不同的IDENTITY
  4. Java盒裝類型是IMMUTABLE VALUE的任何更改也會更改IDENTITY
  5. 如果對象的身份發生變化; Java集合無法有效工作。
  6. 陳述: i1 = 5; =>實際上是i1 = Integer.ValueOf(5) =>這意味着i1
  7. 集合僅存儲IDENTITY ,而不存儲VALUE
  8. 從集合中刪除不存在的IDENTITY (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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM