11

Java で何かを確認したかったのです。文字、整数、または長整数などがある場合、equals を使用する必要がありますか、それとも == で十分ですか?

文字列では、一意の各文字列のインスタンスが 1 つだけであるという保証がないことはわかっていますが、他のボックス化された型についてはわかりません。

私の直感では equals を使用しますが、パフォーマンスを無駄にしないようにしたいと考えています。

4

9 に答える 9

31

編集: 仕様では、ボクシング変換についていくつかの保証が行われています。セクション 5.1.7から:

ボックス化される値 p が true、false、バイト、\u0000 ~ \u007f の範囲の char、または -128 ~ 127 の int または short の数値である場合、r1 と r2 は任意の 2 つのボックス化変換の結果とします。 pの。r1 == r2 は常にそうです。

実装では、より大きなプールを使用できます。

ただし、それに依存するコードを書くことは本当に避けたいと思います。失敗する可能性があるからではなく、明らかではないためです。仕様をよく知っている人はほとんどいません。(以前は実装依存だと思っていました。)

基礎となる値を使用equalsまたは比較する必要があります。

if (foo.equals(bar))

また

if (foo.intValue() == bar.intValue())

オートボクシングが固定値を使用することが保証されていたとしても、他の呼び出し元はいつでも別のインスタンスを作成できることに注意してください。

于 2009-04-09T20:35:27.813 に答える
8

オブジェクトの値について何かを比較したい場合は、 を使用します.equals()

(特に) これらのオブジェクトが、Byte、Character、Short、Integer、Long、Float、Double、および Boolean のプリミティブ ラッパー タイプである場合でも。

" ==" は、オブジェクトの同一性とあなたを比較するだけで、それがあなたの望むものになることはめったにありません。そして、事実上、プリミティブ ラッパーで望むことは決してありません。

==次の 2 つのシナリオのいずれかでのみ使用します。

  1. 比較に含まれるすべての値はプリミティブ型です (浮動小数点数ではないことが望ましい)
  2. 2 つの参照が同じオブジェクトを参照しているかどうかを本当に知りたい場合 (enum値がオブジェクト ID にバインドされているため、これには s の比較が含まれます)
于 2009-04-09T20:38:02.583 に答える
4
//Quick test
public class Test {
  public static void main(String[] args) {
    System.out.println("Are they equal? "+ (new Long(5) == new Long(5)));
  }
}

出力:

「等しいか? 0」

答え:

いいえ、それらは等しくありません。.equals を使用するか、プリミティブ値を比較する必要があります。

于 2009-04-09T20:37:19.090 に答える
2

equals(Object o) メソッドの実装は、ほとんどの場合、

if(this == o) return true;

そのため、equalsif ==is true を使用しても、実際にはパフォーマンスに大きな影響はありません。

常に*equalsオブジェクトに対してメソッドを使用することをお勧めします。

* もちろん、このアドバイスを受け入れてはいけない場合はほとんどありません。

于 2009-04-09T22:21:12.523 に答える
1

利用可能な場合、自動ボックス化された値はプールされたオブジェクトを使用することに注意してください。これが、(Integer) 0 == (Integer) 0 but (Integer) 128 != (Integer) 128 for Java 6u13 の理由です。

于 2009-04-09T22:09:00.587 に答える
1

一般的な答えはnoです。同じ数値に対して、取得する Long オブジェクトが同じであるという保証はありません (Long.valueOf() の使用に制限したとしても)。

ただし、最初に (== を使用して) 参照の等価性をテストし、失敗した場合は equals() を試すことで、パフォーマンスが向上する可能性があります。それはすべて、追加の == テストとメソッド呼び出しの比較コストにかかっています... 走行距離は異なる場合がありますが、どちらが優れているかを確認するために単純なループ テストを試す価値があります。

于 2009-04-09T20:57:00.680 に答える
0

==equals(Object obj)オブジェクトの等価性を比較しながら、オブジェクト参照を比較します。equals オブジェクトのインスタンスが複数存在する可能性がある場合は、等値比較に使用する必要があります。equals

例:

Integer i1 = new Integer(12345);
Integer i2 = new Integer(12345);

これらは異なるオブジェクト インスタンスですが、Integer の等値に従って等しいため、使用する必要があります。equals(Object obj)

public enum Gender {
    MALE, FEMALE;
}

この場合、存在する のインスタンスは 1 つしかないFEMALEため==、安全に使用できます。

于 2009-04-09T21:13:31.140 に答える