-1

私はこの簡単な方法を使用しました:

    Collection<Integer> aCollection = Arrays.asList(1,2,3,4,5,6);
    Integer a = new Integer(5);

    if( aCollection.contains(a) )
        System.out.println("aCollection contains 5");

結果は「aCollection contains 5」です。整数はシステム全体で一意のオブジェクトではありませんが、この場合、「5」はCollection<Integer>実際new Integer(5)には同じオブジェクトへの参照ですか? を呼び出すときに、コレクションがこのように動作すると安全に想定できます.contains()か?

==参照と値を結果で比較すると次のようになるため、わかりません。

3 == new Integer(3)
new Integer(3) != new Integer(3)
new Integer(3) == 3
4

4 に答える 4

5

contains参照による比較は行いません。new Integer(50000)への別の呼び出しとは異なりnew Integer(50000)ます。ただし、firstInt.equals(new Integer(50000))true を返すため、contains は機能します。インターンは低い数値で発生する可能性があるため、高い数値を使用します。

0-127 は、ボクシングを実行するときに固定プールに入れられますが、明示的に新しいオブジェクトを作成するときは入れられないため、同じ値への同じ参照がありますが、それ以上では、インターンの保証はなく、参照が同じ値の異なる Integer オブジェクト。Integer.valueOf(適切な場合、つまり、常にこの範囲内でインターンを試みますが、[-128, 128)この範囲外でのインターンの有無については指定しません。

を呼び出すときに、コレクションがこのように動作すると安全に想定できます.contains()か?

コレクションの 1 つ以上のメンバーが を満たしている場合、またはが null で、少なくとも 1 つのメンバーが存在する場合にのみ、.contains(Object o)が返されると想定できます。true thatmember.equals(o)onull

技術的に:

trueこのコレクションに指定された要素が含まれているかどうかを返します。より正式には、trueこのコレクションに のような要素 e が少なくとも 1 つ含まれている場合にのみ、を返します(o==null ? e==null : o.equals(e))

于 2013-09-02T09:10:23.707 に答える
1

JavaDocで定義されています。

boolean contains(Object o)

trueこのコレクションに指定された要素が含まれているかどうかを返します。より正式には、trueこのコレクションに のような要素 e が少なくとも 1 つ含まれている場合にのみ、を返します(o==null ? e==null : o.equals(e))

つまり、 isの場合、コレクションに要素が含まれている場合onullcontains が返されます。それ以外の場合は、検索している要素が存在する場合にのみ返されます。truenulltrueequals()

を呼び出すたびに異なる参照が返されますが、すべてのオブジェクトはclassのメソッドnew Integer(5)に従って互いに同等です。equals()Integer

このオブジェクトを指定されたオブジェクトと比較します。結果は、引数がそうではなく、このオブジェクトと同じ値を含むオブジェクトであるtrue場合にのみ得られます。nullIntegerint

于 2013-09-02T09:13:24.050 に答える
0

.contains()コレクションの.equals()内部でメソッドを呼び出します。

あなたの場合、整数オブジェクトを使用しています。また、整数オブジェクト .equals() は、リストしたすべてのケースで true を返す可能性があります。

ただし、Person などのカスタム オブジェクトには当てはまらない場合があります。

今はコレクションに

Collection<Person> aCollection = Arrays.asList(b,c,d);
    Person a = new Person("Abhishek");

false を返す場合があります。Person クラスで .equals() メソッドをオーバーライドしていないため

于 2013-09-02T09:14:39.677 に答える
0

オートボクシングは、Java コンパイラがプリミティブ型とそれに対応するオブジェクト ラッパー クラスとの間で行う自動変換です。たとえば、int から Integer への変換、double から Double への変換などです。変換が逆の場合、これはボックス化解除と呼ばれます。

http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html

于 2013-09-02T09:15:25.390 に答える