Javaでの==とequalsの分析

王林
リリース: 2019-11-27 16:21:07
転載
1827 人が閲覧しました

Javaでの==とequalsの分析

== 分析

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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート