違い:
「==」メモリ内に2つの基準点の比較は、メモリ空間内の記憶場所が同じであることを意味同じオブジェクト(ある、同じメモリ空間)ではありません。(参照型)
二つの基準オブジェクトが同じである場合、「==」演算子の戻りが真(同じオブジェクトをポイント)、そうでなければflase。
注:あなたが持っている場合は、メモリの割り当てと変数の保管場所(ヒープ、スタック、一定のプールエリア方法、静的メソッドエリア地区)興味を非常に詳細に書かれているこのブログを、行くと見ることができます。私はまだ人々にはまだ消化するために、コンテンツの多くを理解するために大きな助けの基盤れる学んでいます。
オブジェクト・クラスによって提供される方法は、サブクラスによってオーバーライドすることができる等しいです
次のようにObjectクラスのデフォルトの実装は次のとおりです。
1つの公共ブール等しい(オブジェクトobj){ 2 3リターン(この== OBJ)。 4 5}
オブジェクト自体と比較され、この時間は「==」等価である場合にのみ、デフォルトの実装はtrueを返します。
多くのJavaクラス(StringクラスDateクラスファイルクラス)メソッドは、ここでStringクラスの一般的な例を取るために書き直されまし等しい上のすべてです。
1つのパブリッククラスのテスト{ 2のpublic static無効メイン(文字列[] args){ 3文字列STR1 = "ABC"。 4文字列STR2 = "ABC"。 5のSystem.out.println(STR1 == STR2); //真 6 7 8文字列STR3 =新しい文字列( "ABC"); 9文字列STR4 =新しい文字列( "ABC"); 10のSystem.out.println(STR3 == STR4); //偽 11のSystem.out.println(str3.equals(STR4)); //真 12} 13}
例ライン5、我々はSTR1 == str2の結果を見るには真であります
理由の分析:
コードの3行目を見ては、スタック内のオブジェクト変数STR1文字列クラスへの参照を作成し、何の「ABC」が存在しない文字列定数プールを参照することにより見つけられない場合、文字列に格納し、「ABC」定数プール。ここで定数プールは、「ABC」ではありません。それは、(二重引用符で直接定義)コンパイル時に「ABC」で作成した、それが一定のプールに格納されます。(定数プールがある場合は上記の推奨私のブログで見ることができます理解していません)
コードの4行目とは、作らない場合、文字列定数プールに格納されている「ABC」、及びSTR2点をクラス文字列STR2のオブジェクトへの参照を作成し、いかなる「ABC」が存在しない文字列定数プールを参照することによって見つけますあなたはすでに「ABC」を持っている場合は、「ABC」は、「ABC」にSTR2ポイントの直接の原因です。ここでは、この文字列は定数プールに格納された「ABC」のコードの3行目を持っています。同じ「ABC」にSTR1とstr2ポイントので、trueを返します。
ライン8とそれぞれのコードの行9は、2つのオブジェクトを作成し、異なるオブジェクト、すなわち、上記異なるメモリ記憶場所にSTR3 STR4ポイント。だから、STR3 == STR4リターンは確かに偽です。
コードstr3.equalsの第11行(STR4)がtrueを返します
Stringクラスをオーバーライドするためのデータが同一のメモリ空間に格納されているか否かを比較する方法に等しいです。ここでは、trueを返す文字列「abc」が格納されています。
要約:
Java言語は、開発者が条件を2つのオブジェクトが等しいのである満たすものを定義する必要がありますのでこの方法は、実際に、上書きする開発者に引き渡される等しいです。
我々は単にはいequalsの比較どのような最終的にそれを言うことはできませんので。あなたは、クラスはメソッドが定義を参照することであるが何を意味するかである等しいかを知りたいです。(上記のほとんどのユーザノウハウからの応答です)
私たちは、対等の存在の目的ということを理解する必要があります。