まず第一に、それらの違いを見てみましょう:
(推奨学習: java エントリー プログラム)
equals() メソッドは、2 つのオブジェクトの内容が等しいかどうかを比較するために使用されます。すべてのクラスは java.lang.Object クラスを継承するため、このメソッドがオーバーライドされない限り、すべてのオブジェクトに適用できます。 . 、まだ呼び出されるメソッドは Object クラスのメソッドですが、Object の equals メソッドは ==;
"== の判定を返します。変数 (スタック) メモリを比較します。に格納されているオブジェクトの (ヒープ) メモリ アドレスは、2 つのオブジェクトのアドレスが同じかどうか、つまり、それらが同じオブジェクトを参照しているかどうかを判断するために使用されます。
equals() 関数
equals() 関数は、2 つのオブジェクトが等しいかどうかを判断するために使用されます。
equals()はJDKのObject.javaで定義されています。 2 つのオブジェクトが等しいかどうかは、アドレスが等しいかどうか (つまり、同じオブジェクトであるかどうか) で判断します。ソース コードは次のとおりです。
public boolean equals(Object obj) { return (this == obj); }
equals() メソッドは Object.java で定義されているため、これは、すべての Java クラスが equals() メソッドを実装し、すべてのクラスが equals( を介して 2 つのオブジェクトを比較できることを意味します。 ). オブジェクトが等しいかどうか。
ただし、デフォルトの「equals()」メソッドの使用は「==」メソッドと同等であるとすでに述べました。したがって、通常は、equals() メソッドをオーバーライドします。2 つのオブジェクトの内容が等しい場合、equals() メソッドは true を返し、そうでない場合は、fasle を返します。
以下は、「クラスがequals()メソッドをカバーするかどうか」に基づいて2つのカテゴリに分類されます。
クラスが equals() メソッドをカバーしていない場合、equals() を通じて 2 つのオブジェクトを比較するとき、実際には 2 つのオブジェクトが同じオブジェクトであるかどうかが比較されます。このとき、2つのオブジェクトを「==」で比較することと同じになります。
クラスのequals()メソッドをオーバーライドして、他のメソッドを通じて2つのオブジェクトが等しいかどうかをequals()に比較させることができます。通常のアプローチは、2 つのオブジェクトの内容が等しい場合、equals() メソッドは true を返し、それ以外の場合は fasle を返します。
以下は、上記の 2 つの状況を説明する例です:
1.equals() メソッドをカバーしていないケース
public class EqualsTest { public static void main(String[] args) { // 新建2个相同内容的Person对象, // 再用equals比较它们是否相等 User user1 = new User("James", 100); User user2 = new User("James", 100); System.out.printf("比较结果:" + user1.equals(user2)); } /** * @desc User类。 */ static class User { int age; String name; public User(String name, int age) { this.name = name; this.age = age; } public String toString() { return name + " - " + age; } } }
実行中結果:
false
結果分析:
「user1 と user2 が等しいかどうかを比較する」ために user1.equals(user2) を使用します。実際、Object.java の equals() メソッドは次のとおりです。呼び出されます。つまり、Called (user1==user2) です。
「p1とp2が同じオブジェクトかどうか」を比較します。 user1 と user2 の定義から、これらは同じ内容を持ちますが、2 つの異なるオブジェクトであるため、戻り結果は false であることがわかります。
(ビデオ チュートリアルの推奨: java ビデオ チュートリアル)
2.quals() メソッドのオーバーライド
上記の EqualsTest を変更し、equals( )メソッド:
public class EqualsTest { public static void main(String[] args) { // 新建2个相同内容的Person对象, // 再用equals比较它们是否相等 User user1 = new User("James", 100); User user2 = new User("James", 100); System.out.printf("比较结果:" + user1.equals(user2)); } /** * @desc User类。 */ static class User { int age; String name; public User(String name, int age) { this.name = name; this.age = age; } public String toString() { return name + " - " + age; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; User other = (User) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } } }
実行結果:
true
結果分析: EqualsTest.java で User の equals() 関数を書き直しました: 2 つの User オブジェクトの名前と年齢が等しい場合、 true を返します。したがって、実行結果は true を返します。
== 関数
"==: この関数は、2 つのオブジェクトのアドレスが等しいかどうかを判断することです。これは、参照オブジェクトが、指定されたヒープ内のオブジェクトと同じであるかどうかを判断するためであり、すべての新しいオブジェクトがヒープ内にあることがわかっています。オブジェクトへの参照はスタック、特にスタック フレームに格納されます。次のコード部分を見てみましょう:
public static void main(String[] args) { User user1 = new User("James", 100); User user2 = new User("James", 100); System.out.println("user1.equals(user2):" + user1.equals(user2)); System.out.println("user1==user2:" + (user1==user2)); }
出力結果:
user1.equals(user2):true user1==user2:false
はヒープ ブロック内の 2 つのオブジェクトを指します領域が異なるため、「==」と比較すると false が返されます。
以上がequals()関数と「==」の機能は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。