0

これはこの質問の複製のようなものですが、回答の「変更可能なキー」と「バケット」のELI5の説明をもう少し探しています。

ここに私が理解に苦しんでいる私のコードがあります:

HashSet<Object> set = new HashSet<Object>();
    set.add(1); set.add(2); set.add(3);

    for(Object i : set)
        if(i.equals(1)) {
            i = 1337;
            System.out.println("FOUND"); 
        }

    for(Object i : set) System.out.println(i);

出力:

FOUND

1

2

3

代わりに 1337, 2, 3 が出力されないのはなぜですか?

同じ質問がオブジェクトの削除にも当てはまります。

編集:

これは私が望むことを行いますが、正しい方法ではないことはかなり確信しています:

for(Object i : set)
        if(i.equals(1)) {
            set.remove(i);
            set.add(1337);
            break;
        }
4

2 に答える 2

3

ここでプリミティブを処理しています。ループで行うことは、forから値をコピーしSetてからi、それを使用して何かを行うことです。今、iは完全に新しい変数であり、 ではなく、その値を変更しましたSet。したがって、Set変更されません。したがって、それを削除してからSet新しい値を入力する必要があります。これで問題ありません。

for(Object i : set)
        if(i.equals(1)) {
            set.remove(i);
            set.add(1337);
            break;
        }

オブジェクトがある場合も同じことが起こります。同じオブジェクトではなく、同じ場所を指す2つのポインターがあるため、1つのポインターを削除しますが、1つSetは残るためGC、オブジェクトは削除されません。のポインターSetが削除されます (したがって、オブジェクトを指すポインターはありません)。

于 2016-05-05T04:22:14.407 に答える
0

set.remove(i)&を実行するset.add(i)と、セットで操作を実行しているため機能します。

しかし、i=1337そうすると、変数に値を割り当てるだけでi、設定操作は実行されません。

于 2016-05-05T04:18:47.397 に答える