JavaでのhashCodeメソッドの使い方

WBOY
リリース: 2023-05-11 13:49:06
転載
1735 人が閲覧しました

1. hashCode メソッドの紹介

  • hashCode() この関数はハッシュ コード (ハッシュ コードとも呼ばれます) を取得するもので、実際には整数を返します。このハッシュ コードの目的は、ハッシュ テーブル内のオブジェクトのインデックス位置を決定することです。

  • hashCode() は JDK の Object.java で定義されています。つまり、Java のクラスには hashCode() 関数が含まれています。

  • ハッシュテーブルはキーと値のペアを格納しており、「キー」に応じて対応する「値」を素早く取り出すことができるのが特徴です。これはハッシュコードを使用します。 (必要なオブジェクトをすぐに見つけることができます)。

2. なぜ hashCode メソッドが必要なのでしょうか?

プログラムを作成する過程で、2 つのオブジェクトが同じかどうかを判断することは非常に一般的で、よく直面する問題です。 hashCode() メソッドは、2 つのオブジェクトの比較速度を向上させるために使用されます。

「HashSet の重複をチェックする方法」を例として、hashCode が必要な理由を説明します。

  • オブジェクトを HashSet## に追加するとき#、HashSet は最初にオブジェクトの hashcode 値を計算して、オブジェクトが追加される場所を決定します。また、追加された他のオブジェクトの hashcode 値と比較します。一致する ハッシュコード がない場合、HashSet はオブジェクトが繰り返し出現しないものとみなします。

  • ただし、同じ

    hashcode 値を持つオブジェクトが見つかった場合、equals() メソッドが呼び出され、hashcode が等しいかどうかを確認します。オブジェクトは true です。同じです。 2 つが同じ場合、HashSet では結合操作は成功しません。異なる場合は、別の場所に再ハッシュされます。

  • このようにして、

    equals の数を大幅に減らし、それに応じて実行速度を大幅に向上させます。

3. 2 つのメソッド hashCode() と equals() の関係は何ですか?

Java では、eqauls() メソッドと hashCode() メソッドを次のように規定しています。 :

  • 同じオブジェクトに対して hashCode() メソッドを複数回呼び出すと、常に同じ整数値が返されます。

  • a.equals(b) の場合、a.hashCode() は b.hashCode() と等しくなければなりません。

  • !a.equals(b) の場合、a.hashCode() は必ずしも b.hashCode() と等しいとは限りません。このとき、a.hashCode() と b.hashCode() が常に等しくない場合、ハッシュテーブルのパフォーマンスが向上します。

  • a.hashCode()==b.hashCode() の場合、a.equals(b) は true または false

  • a になります。ハッシュコード ()! = b.hashCode() の場合、a.equals(b) は false になります。

上記の結論の省略形:

  • 2 つのオブジェクトが等しい場合、Java ランタイム環境は、それらのハッシュコードが等しい必要があると判断します。

  • 2 つのオブジェクトが等しくない場合、それらの hashCode は等しい可能性があります。

  • 2 つのオブジェクトの hashCode が等しい場合、それらは必ずしも等しいとは限りません。

  • 2 つのオブジェクトの hashCode が等しくない場合、それらは等しくなくてはなりません。

4. なぜ、equals メソッドをオーバーライドすることで hashcode メソッドをオーバーライドする必要があるのでしょうか?

  • 2 つのオブジェクトが

    等しい場合、それらの hashCode 値は等しくなければならないと上で説明しました。 hashCode メソッドをオーバーライドせずに equals メソッドのみをオーバーライドする場合、hashCode の値は異なり、equals メソッドは判定結果は true です。

  • Java の一部のコンテナでは、同一のオブジェクトを 2 つ使用することはできず、挿入時に同一と判断された場合は上書きされます。このとき、
  • hashCode

    メソッドを書き換えずに、equalsメソッドのみを書き換えると、オブジェクト内のhashCodeは、オブジェクトのストレージアドレス変換に基づいて形成されます。オブジェクト、ハッシュ値。このとき、hashCodeメソッドがオーバーライドされていないため、同じオブジェクトが別の場所にハッシュされ、オブジェクトが上書きできないという問題が発生する可能性があります。

犬のクラス

package com.xiao;

/**
 * @author :小肖
 * @date :Created in 2022/3/11 14:42
 */
public class Dog {

    private String name;

    private Integer age;


    public Dog() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Dog(String name, Integer age) {
        this.name = name;
        this.age = age;
    }


    @Override
    public boolean equals(Object obj) {
        if(obj.getClass() != getClass()){
            return false;
        }
        Dog dog = (Dog) obj;
        if(dog.getAge() == age && dog.getName().equals(name)){
            return true;
        }
        return false;
    }
}
ログイン後にコピー

テストクラス

import com.xiao.Dog;

public class Test {

    public static void main(String[] args) {
        Dog dog = new Dog("小旺",2);
        Dog dog1 = new Dog("小旺",2);
        System.out.println("equals结果:" + dog.equals(dog1));
        System.out.println("dog 的 hashCode 值是否等于 dog1 的 hashCode 值:" +(dog.hashCode() == dog1.hashCode()));
    }
}
ログイン後にコピー

テスト結果

等しい結果: true
dog のハッシュコード値は、dog1 のハッシュコード値と等しいか: false


以上がJavaでのhashCodeメソッドの使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!