Javaの==メソッドとequals()メソッドについて話す

==演算子

Javaで2つの変数が等しいかどうかを測定する方法は2つあります。1つは==演算子を使用する方法、もう1つはequals()メソッドを使用する方法です。

  1. 基本データタイプ
    ==を使用して、変数が等しいかどうかを判断します。変数が4つのタイプと8つの基本データタイプであり、2つの変数の値が同じである限り、それらがすべて数値タイプである場合、trueを返すことができます。
public class Test {
    
    
    public static void main(String[] args) {
    
    
        char a='A';
        int b =65;
        double c=65.0d;
        System.out.println(a==b);//end=true
        System.out.println(b==c);//end=true
        System.out.println(a==c);//end=true
    }

}

上記のコードでは、char文字aのasciiコード値は65であるため、==演算子を使用して、abcの3つの変数を判断してtrueにします。

  1. 参照タイプ

参照型変数の場合、2つの変数が同じ型であるか、親子関係にある場合にのみ使用できます。そうでない場合、エラーが報告されます。2つの参照型変数が==演算子を使用する場合、それらが同じオブジェクトを指している場合にのみtrueを返します。

 public static void main(String[] args) {
    
    
    String a=new String("abc");
    String b=new String("abc");
        System.out.println(a==b);//end=false
}

上記のプログラムでは、変数aと変数bの値は両方ともabcですが、aとbの参照が異なるため、falseが返されます。

文字列定数プール

初心者にとって、Stringには非常に紛らわしい場所がたくさんあります。 "abc"とnewString( "abc")の違いは何ですか?この問題を解決するには、Java文字列定数プールメカニズムを理解する必要があります。文字列定数プール
の場所
文字列定数プールはメソッド領域にあります。文字列を作成するときは、最初に文字列が定数プールに存在するかどうかを確認します。存在する場合は、文字列への参照を直接返します。存在しない場合は、文字列定数になります。プールに文字列を作成し、参照を返します。JVM定数プールは、同じ文字列の直接量が1つだけであり、複数のコピーを生成しないことを保証します。

   String a="我爱学习";
   String b="我爱"+"学习";
   String c="学习";
   final String d="学习";
   String e="我爱"+c;
   String f="我爱"+d;
   System.out.println(a==b);//end=true,因为b在编译阶段可以确定下来,
   //因此b直接返回字符串常量池中的引用,所以相等。
   System.out.println(a==e);//变量e="我爱"+c;变量c在编译时不能确定下来,因此返回false
   System.out.println(a==f);
  /*end=true 变量d加入final修饰符,final会告诉编译器变量d这个数据不会修改,在编译时直接将变量d替换成"学习",因此编译时变量f可以确定下来为"我爱学习",直接返回字符串常量池的引用,故a==f
  */

new String( "abc")を使用する場合、JVM仮想マシンは最初に定数プールに "abc"があるかどうかを確認し、存在しない場合は "abc"文字列を作成してから、Stringコンストラクターを呼び出してヒープメモリに作成します。新しいStringオブジェクトの値はabcであり、ヒープメモリ内のオブジェクトへの参照を返します。簡単に言うと、new String()を使用すると、2つのオブジェクトが作成されます。

String a=new String("abc");
String b="abc";
System.out.println(a==b);//end=false

上の図では、変数を宣言するときに、JVMは最初に文字列定数プールに「abc」オブジェクトを作成し、次にヒープメモリに「abc」オブジェクトを作成してから、ヒープメモリ内のオブジェクトへの参照をに返します。変数bが宣言されると、JVMは文字列定数プールで「abc」を検出し、定数プール内のオブジェクトの参照をbに直接返します。変数aと変数bの内容は同じですが、1つは定数プールへの参照であり、もう1つはヒープメモリへの参照です。したがって、a == bの結果はfalseです。

equals()メソッド

equals()メソッドはObjectクラスが提供するインスタンスメソッドです。2つの参照型変数が等しいかどうかを判断するために使用されます。Objectクラスのソースコードをクリックするとわかります。このメソッドは、2つのオブジェクトが等しいかどうかを判断し、==演算子に違いがないためです。 Objectクラスのこのメソッドはほとんど意味がなく、実際の開発ではこのメソッドをオーバーライドすることがよくあります。

//Object类源码
public boolean equals(Object obj) {
    
    
        return (this == obj);
    }

Stringクラスはequals()メソッドをオーバーライドしますが、2つの文字列のシーケンスが同じである限り、trueを返すことができます。したがって、次のコードの実行結果はすべて真です。

   String a="我爱学习";
   String b="我爱"+"学习";
   String c="学习";
   final String d="学习";
   String e="我爱"+c;
   String f="我爱"+d;
   System.out.println(a.equals(b));//end=true
   System.out.println(a.equals(e));//end=true
   System.out.println(a.equals(f));//end=true

実際の開発では、通常、equalsメソッドを書き直す必要があります。メソッドを書き直す場合、等しい条件はビジネス要件によって決定されるため、equals()メソッドの実現もビジネス要件によって決定されます。
一般的に、リライトquals()パーティは、次の条件を満たす必要があります。

  • 反射性:null以外の参照値xの場合、x.equals(x)はtrueを返す必要があります。
  • 対称性:null以外の参照値xおよびyの場合、y.equals(x)がtrueを返す場合に限り、x.equals(y)はtrueを返す必要があります。
  • 遷移性:null以外の参照値x、y、およびzについて、x.equals(y)がtrueを返し、y.equals(z)がtrueを返す場合、x.equals(z)はtrueを返す必要があります。
  • 一貫性:null以外の参照値xおよびyの場合、オブジェクトの等値比較で使用される情報が変更されていない限り、x.equals(y)への複数の呼び出しは常にtrueを返すか、常にfalseを返します。
  • null以外の参照値xの場合、x.equals(null)はfalseを返す必要があります。

おすすめ

転載: blog.csdn.net/ln82799/article/details/109149947