5

このコードの実行:

    public class SomeSet {

    public static void main(String[] args) {

        Set<Short> s = new HashSet<Short>();

        for (short i = 0; i < 100; i++) {

            s.add(i);

            s.remove(i - 1);

        }

        System.out.println(s.size());

    }

}

値 100 を出力します。

なぜこの値を出力するのですか?

4

4 に答える 4

10
s.remove(i - 1);

上記の行はInteger、Java のすべての整数計算にint(またはlong) 結果があるため、セットからオブジェクトを削除しようとします。セットにはShortオブジェクトが含まれているため、remove()メソッドは何の効果もありません。

これ (および同様の問題) が、ほとんど使用しない主な理由ですshort(さらに、Short)。実装を使用しSetて自動ボックス化された数値を含めると、大量の (簡単に 1000%) オーバーヘッドが発生するため、 ではなく を使用してスペースを節約しようとするのは無意味ShortですInteger

于 2010-06-07T09:02:37.683 に答える
7

問題は、オブジェクトを使用してメソッドをremove(i-1)呼び出すことです。これは、型( に自動ボックス化される) であるためです。removeIntegeri-1intInteger

オブジェクトで呼び出すことを確認するにはremove、これを使用します。Short

s.remove((short) (i - 1));
于 2010-06-07T09:03:28.063 に答える
0

のタイプi - 1intであるため、整数に自動ボックス化されます。

通常、ジェネリックコレクションは、間違った型の引数を持つ操作の実行を防ぐことを期待しますが、へのインターフェイスSet<E>は少し緩いです。

removeメソッドSet<E>は、Objectではなくを使用するためE、コンパイラは、セットに含まれているものとは異なるタイプを削除することを警告しません。

強制的ににするにはShort、数値をにキャストします(short)。(にキャストすること(Short)は許可されていません。使用するには数値をキャストする必要がありますShort.valueOf

于 2010-06-07T09:09:30.107 に答える
0

add メソッドは一般的に型指定されboolean add(E o)ているため、Set の場合、add メソッドは短くなりますが、remove メソッドは一般的に型指定されていないboolean remove(Object o)ためi - 1、整数に自動ボックス化されることに注意してください。i の値new Short(i).equals(new Integer(i))は常に false になります。

これを試みると、 が Integer のインスタンスになり、Integer と Short の型が一致しないs.add(i - 1);ため、コンパイラ エラーが発生することに注意してください。i - 1

于 2010-06-07T09:16:24.740 に答える