ホームページ  >  記事  >  Java  >  イコールとハッシュコード

イコールとハッシュコード

(*-*)浩
(*-*)浩転載
2019-08-24 15:53:482420ブラウズ

equals とハッシュコードの概要:

イコールとハッシュコード

equals メソッドがオーバーライドされていない場合、このメソッドは、オブジェクトのメモリアドレス参照、アドレスを使用するかどうか。書き換えた後、オブジェクトの内容が等しいかどうかを比較するのに一般的に使用されます(たとえば、学生オブジェクトには名前と年齢が含まれています。名前と年齢が同じであれば、等しいと判断するようにequalsメソッドを書き換えます)学生とみなされます)。

HashCode はオブジェクトのアドレスや文字列、数値などを元に jdk が計算した int 型の値です もちろん書き換えることも可能です ハッシュコードメソッドはコレクション内でのみ使用されます。

オブジェクトをセットに入れるときは、まずハッシュコードが等しいかどうかを判定し、次に等しいかどうかを判定します。すべてが等しい場合、それは同じオブジェクトです。リストを入れることができます。 in ですが、set では重複が許可されていないため、重複は許可されません。

例:

public class Student {
        private int age;
        private String name; 
        public Student(int age ,String name){
            this.age = age;
            this.name = name;
        }
        public int getAge() {
           return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public String getName() {
           return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        //重写equals方法,判断姓名和年龄相同就是相等的
        public boolean equals(Object o){
            if(o == null){
                return false;
            }
            if(this.getClass() != o.getClass()){
             return false;   
            }
            Student student = (Student)o;
            if(name == null){
                return false;
            }
            if(age==student.getAge()&&name.equals(student.getName())){
                return true;
            }
            return false;
        }       
    public static void main(String[] args) {
        Student studentOne = new Student(1,"yjc");
        Student studentTwo = new Student(1,new String("yjc"));
        System.out.println(studentOne.equals(studentTwo));
        System.out.println("1: "+studentOne.getName().hashCode());
        System.out.println("2: "+studentTwo.getName().hashCode());
    }
    //输出结果:true
                1: 119666
                2: 119666
}

上記からわかるように、直接「yjc」であっても新しい文字列 (「yjc」) であっても、両方の文字列は「yjc」と呼ばれます。 、そのハッシュコード すべて同じです。したがって、ハッシュコードメソッドをオーバーライドするときにこれを使用できます。

たとえば、名前と年齢が同じである場合、等しいだけでなくハッシュコードも同じである必要がある場合は、ハッシュコードを次のように書き換えることができます:

public int hashcode(){
    final int prime = 31; 
    int result = 1;    
    result = prime*result + age;    
    result = prime*result + (name == null? 0 : name.hashcode());   
    return result;//直接写age+(name == null? 0 : name.hashcode())也行就是感觉太简单了0.0
}

このようにして、同じ名前と年齢を持つ 2 人の生徒が存在します。オブジェクトは同じオブジェクトであり、セットに配置されると同じとみなされます。そのようなオブジェクトがいくつ配置されても、set.size() は常に1に等しくなります。

同様に、HashMap のキーも一意であり、HashMap オブジェクトは Key の hashCode に基づいて格納場所を特定し、equals(key) を使用して対応する Value を取得することで、キーが固有であるかどうかを判断します。 put 中にハッシュコードを再利用しました。繰り返されると、equals は上書きされます。

以上がイコールとハッシュコードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。