9
Object o1 = new Object();
Object o2 = new Object();
//o1=o2;
System.out.println(o1.equals(o2));

返しますfalsetrueコメントが削除された場合、を返すことができます。


Stringクラスに同じことが当てはまらないのはなぜですか?

String s1=new String();
String s2=new String();
System.out.println(s1.equals(s2));

返しますtrue。なんで?(Stringインターン生とか関係あるから?)

4

7 に答える 7

20

String の equals()は、オブジェクト自体ではなくコンテンツを比較するためです。

public boolean equals(Object anObject)

この文字列を指定されたオブジェクトと比較します。String引数が null ではなく、このオブジェクトと同じ文字シーケンスを表すオブジェクトである場合にのみ、結果は true になります。

    /* String.equals() */
public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = offset;
            int j = anotherString.offset;
            while (n-- != 0) {
                if (v1[i++] != v2[j++])
                    return false;
            }
            return true;
        }
    }
    return false;
}

( String.equals()のソースへのリンク)

Objectのequals に対して:

class の equals メソッドはObject、オブジェクトに対して最も識別可能な等価関係を実装します。つまり、null 以外の参照値xおよびyについて、このメソッドは true を返すのは、 およびが同じオブジェクトxを参照している (値が を持っている) 場合のみです。yx == ytrue

/* Object.equals() */
public boolean equals(Object obj) {
    return (this == obj);
}

( Object.equals()のソースへのリンク)

equals()また、関数の契約を忘れないでください。

equals メソッドは、null 以外のオブジェクト参照に対して等価関係を実装します。

  • 再帰的です: null 以外の参照値xに対しては、x.equals(x)true を返す必要があります。
  • これは対称的です: null 以外の参照値xyについては、 x.equals(y)true を返す場合にのみ true を返す必要がありy.equals(x)ます。
  • これは推移的です: null 以外の参照値xy、およびに対して、が返され、が返さzれる場合は、が返されます。x.equals(y)truey.equals(z)truex.equals(z)true
  • 一貫性があります :オブジェクトの equals 比較で使用される情報が変更されていない場合、 null 以外の参照値xおよび、一貫して returnまたは一貫して returnyを複数回呼び出します。x.equals(y)truefalse
  • null 以外の参照値の場合xx.equals(null)を返す必要がありfalseます。

また読むことをお勧めします:

于 2012-10-21T20:40:42.387 に答える
9

equalsfor はObjectメモリ参照を比較します。文字に基づいて比較するためにオーバーライドされるため
、これらは異なるため、falseです。 2 つの空のオブジェクトがあるため、が返されます。Object
equalsString
Stringequalstrue

于 2012-10-21T20:41:10.910 に答える
5

==オブジェクト/文字列/何でものアドレスを比較します

.equals()比較のためにオブジェクトの内部状態を使用するように設計されています。

そう:

new Object() == new Object() => false- メモリ内の異なるアドレスにある 2 つの個別のオブジェクト。

new String("a") == new String("a") => false- 同じ状況 - 文字列オブジェクトの 2 つの別々のアドレス。

new String("a").equals(new String("a")) => true- アドレスは異なりますが、Java は 1 つのオブジェクト状態 ('a') を取り、他のオブジェクト状態 ('a') と比較すると、それらが等しいことがわかり、true を報告します。

equals() メソッドを使用すると、プログラムに適した方法で比較をコーディングできます。

intern()は少し違う話です。同じ char シーケンスに対して同じオブジェクト (アドレス) を返すことを意図しています。同じ文字列を複数回構築する場合に必要なメモリ量を減らすのに役立ちます。

new String("aaa").intern()誰かが以前に「aaa」文字列を作成したことがある場合は、マシンのメモリをシークし、文字列の最初のインスタンスを返します...見つからない場合-現在のインスタンスが最初のすべての「aaa」.internとして登録されます() および newString("aaa").intern()であり、("a"+"aa").intern()その「最初の」インスタンスを返します。

注意:"aaa".intern()操作はそれほど高速ではありません。すべての文字列をインターンすると、メモリがいくらか節約されますが、かなりの量の CPU 作業が失われます。

于 2012-10-21T21:09:20.080 に答える
2

クラスにequals実装されている はObject参照のみを比較します。ソースコードは次のとおりです。

public boolean equals(Object obj) {
return (this == obj);
}
于 2012-10-21T20:42:11.930 に答える
2

他の方法で動作させたい場合は、クラス内で equals メソッドをオーバーライドする必要があります。デフォルトでは、2 つの参照が同じオブジェクトを参照しているかどうかを確認します。

于 2012-10-21T20:45:40.777 に答える