1. 程式人生 > >JAVA hashCode和equals方法詳解

JAVA hashCode和equals方法詳解

hashCode和equals方法都是Object基類的方法

先看一個例子


public class Studeng {

    private Integer sid;

    private String name;



    public Integer getSid() {
        return sid;
    }
    public void setSid(Integer sid) {
        this.sid = sid;
    }
    public String getName() {
        return name;
    }
    public
void setName(String name) { this.name = name; } @Override public int hashCode() { System.out.println("-------hashCode方法被呼叫啦--------》"); return sid; } @Override public boolean equals(Object obj) { System.out.println("-equals方法被呼叫啦--->"); return
true; } } public class Demo1 { public static void main(String[] args) { Studeng student=new Studeng(); student.setSid(121); Studeng student2=new Studeng(); student2.setSid(121); System.out.println(student==student2); System.out.println("xxxxxxxxxoooooooooo"
); System.out.println(student.equals(student2)); } }

答案是什麼呢?

false xxxxxxxxxoooooooooo -equals方法被呼叫了—> true

直接new兩個物件,直接==不會呼叫我們重寫的hashCode方法,如果是new的,肯定返回false.equals方法,如果呼叫了該方法則會呼叫被重寫的方法,返回相應的boolean值。

如果感覺如此,該文章是不是太沒意思了,是吧。

我稍作修改一下 main方法。

public static void main(String[] args) {
        Studeng student=new Studeng();
        student.setSid(121);

        Studeng student2=new Studeng();
        student2.setSid(121);

        System.out.println(student==student2);
        System.out.println("xxxxxxxxxoooooooooo");
        System.out.println(student.equals(student2));

        HashSet<Studeng> set2=new HashSet<Studeng>();

        set2.add(student);
        set2.add(student2);

        Iterator<Studeng> it=set2.iterator();
        while(it.hasNext()){
            Studeng student3=it.next();
            System.out.println("&&&&&&&&"+student3.getSid());
        }
    }

此時再判斷一下,應該輸出什麼內容:

false xxxxxxxxxoooooooooo -equals方法被呼叫了—> true 註釋:這幾個和上面的一樣,此處不再贅述

——-hashCode方法被呼叫了——–》 ——-hashCode方法被呼叫了——–》 -equals方法被呼叫了—> &&&&&&&&121

HashSet是不允許放重複物件的,這個大家都知道哦 第一次放入的時候,呼叫了hashCode方法,return了雜湊的一個整數。set第一是空,因此順利放進去了。

第二次放入另一個物件的時候,和第一個物件的sid相同。此時,會先比較兩個物件的雜湊整數是否相同,如果相同則會繼續呼叫equals方法,如果equals相同,則認為是一個物件,我就不能再加入到set集合中,如果equals也不相同,則認為不是同一個物件則可以放入set集合中。

此處就介紹到這裡,下面篇幅會介紹,String是如何重寫hashCode和equals方法的, 可以見下一篇文章