== 分析
1. 基本的なデータ型の場合、比較されるのは、その特定の内容が同じであるかどうかと、そのメモリです。住所は関係ありません。
例:
public class Test{ public static void main(String[] args) { int i = 10; double j = 10.0; float m = 10.0f; char k = 10; boolean b = true; System.out.println(i == j); System.out.println(i == m); System.out.println(m == k); System.out.println("*******************"); //System.out.println(i == b); 很明显,布尔型不能和其他基本数据类型比较,编译报错. System.out.println(System.identityHashCode(i)); System.out.println(System.identityHashCode(j)); System.out.println(System.identityHashCode(m)); System.out.println(System.identityHashCode(k)); System.out.println(System.identityHashCode(b)); } }
出力:
true true true ******************* 366712642 1829164700 2018699554 1311053135 118352462
推奨される関連ビデオ チュートリアル: Java 無料ビデオ チュートリアル
分析:
① 比較結果とメモリアドレスによると、内容は同じですがメモリアドレスが異なりますが、返された結果はすべて true です。つまり、比較するときは、内容が一致しているかどうかだけを見ます。変数に格納される値は同じであり、メモリアドレスとは関係ありません。
②==比較の両側のデータは同じ型に強制的に変換する必要があります。たとえば、int と double の比較は強制的に double になります。
③Boolean 型は、int、float、double、char などの基本データ型と比較できず、コンパイル時にエラーが報告されます。
2. 参照データ型の比較:
public class Test{ public static void main(String[] args) { Test t1 = new Test(); Test t2 = new Test(); String name1 = "琼宝"; String name2 = "琼宝"; System.out.println(name1 == name2); // true System.out.println(System.identityHashCode(name1)); //366712642 System.out.println(System.identityHashCode(name2)); //366712642 System.out.println(t1 == t2); //false System.out.println(System.identityHashCode(t1)); //366712642 System.out.println(System.identityHashCode(t2)); //1829164700 System.out.println(System.identityHashCode(new Test())); //2018699554 System.out.println(System.identityHashCode(new Test())); //1311053135 System.out.println(new Test() == new Test()); } }
出力:
true 366712642 366712642 false 366712642 1829164700 2018699554 1311053135 false
分析:
①参照データ型については、現時点では2 つのメモリが必要であり、比較はメモリ アドレスが同じかどうかです。たとえば、次のステートメントを実行する場合:
Test t1 = new Test() Test t2 = new Test()
の場合、2 つのメモリが開かれます。1 つは t1 t2 の保存用、もう 1 つは 2 つの新しい Test() の保存用です。 t1 と t2 のメモリ アドレスが異なることは明らかであり、2 つの新しい Test() のアドレスさえも異なるため、この時点で == を使用して比較すると、結果は false になるはずです。
(補足: t1 と t2 に格納されるのは、実際には新しい Test() オブジェクトが使用するメモリの先頭アドレスです。)
② String 型の場合、内容がが同じ場合、メモリアドレスも同じであり、比較するときにアドレスも参照されます。
オブジェクトに格納されている内容が同じかどうかを比較したい場合 (アドレスの比較ではない)、 == は実装できず、equals が必要です。
等号の分析
1. 等号比較の例を見てみましょう:
public class TestEquals { public static void main(String[] args) { TestEquals t1 = new TestEquals(); TestEquals t2 = new TestEquals(); System.out.println(t1.equals(t2)); //false String s1 = new String(); String s2 = new String(); System.out.println(System.identityHashCode(s1)); System.out.println(System.identityHashCode(s2)); System.out.println(System.identityHashCode(new String())); System.out.println(System.identityHashCode(new String())); System.out.println(s1.equals(s2)); // true } } 输出结果: false 366712642 1829164700 2018699554 1311053135 true
2. 分析:
①t1 t2 の比較が false、s1 と s2 の比較が true これには、equals メソッドの書き換えが含まれます。まず、オブジェクト クラスの equals のソース コードを確認します。 s1.equals(s2) 、これは s1、obj は s2、ソース コード内の比較では == が使用されており、これは明らかに参照データ型の比較であり、s1 と s2 のメモリ アドレスを調べています。はアドレスが異なることを知っています。したがって、結果は当然 false になります。
③s1 と s2 の比較結果は true です。これは、String クラスで、equals メソッドが書き換えられているためです。ソース コードを参照してください。
public boolean equals(Object obj) { return (this == obj); }
④合格 これを object 内の等しいソース コードと比較すると、String 内の等しいメソッドがオブジェクトのアドレスを比較するのではなく、2 つのオブジェクトの内容、または属性が一致しているかどうかを確認していることがわかります。 2 つのオブジェクトは同じです。
⑤String、Date、File...などのクラスはすべてequalsメソッドを書き換えます。
概要: 1.==基本的なデータ型を比較する場合、内容が等しいかどうかが比較されます。参照データ型は、メモリアドレスが等しいかどうかによって異なります。
2.equals は参照データ型 (オブジェクト) のみを比較できます。書き換え前は == を使用してメモリ アドレスを比較します。書き換え後は、オブジェクトの具体的な内容と属性が一致しているかどうかが比較されます。
その他の関連記事やチュートリアルについては、次を参照してください:
Java プログラミングの概要以上がJavaでの==とequalsの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。