ホームページ > Java > &#&はじめる > equals()関数と「==」の機能は何ですか?

equals()関数と「==」の機能は何ですか?

王林
リリース: 2020-07-10 16:59:39
転載
3452 人が閲覧しました

equals()関数と「==」の機能は何ですか?

まず第一に、それらの違いを見てみましょう:

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

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