(4)面試題:hashcode相等兩個類一定相等嗎?equals呢?相反呢?

首先如果hashcode相等的話,這兩個類也是不一定相等的,如果是反過來的話(通常情況下,如果兩個對象的內容相同,兩個對象的hashcode也是相同的)

hashcode()和equals()的關係:

(1)如果不創建“類對應的散列表的話”(就是當我們不會把一個類放到在HashSet, Hashtable, HashMap這種底層實現是以hashcode來去定位存儲位置的話),如果不是這種情況下的話,此時這個類的hashcode()和equals()是沒有一點關係的

(2)如果恰好用到了上面所說的“創建了類對應的散列表的話”,那麼也就是你把這個類作爲key來去存儲其他的value的話,這種情況下是可以進行比較的

  • 如果兩個對象相等,那麼它們的hashCode()值一定相同。這裏的相等是指,通過equals()比較兩個對象時返回true。
  • 如果兩個對象hashCode()相等,它們並不一定相等。
    因爲在散列表中,hashCode()相等,即兩個鍵值對的哈希值相等。然而哈希值相等,並不一定能得出鍵值對相等。補充說一句:“兩個不同的鍵值對,哈希值相等”,這就是哈希衝突。(若要判斷兩個對象是否相等,除了要覆蓋equals()之外,也要覆蓋hashCode()函數。否則,equals()無效。 )
public class test {

    public static void main(String[] args) {
        // 新建Person對象,
        Person p1 = new Person("eee", 100);
        Person p2 = new Person("eee", 100);
        Person p3 = new Person("aaa", 200);



        // 新建HashSet對象
        HashMap map = new HashMap();
        map.put(p1,"woshi---p1");
        map.put(p2,"woshi---p2");
        map.put(p3,"我是P3");

        System.out.println(map.get(p1)+"---------------------");
        System.out.println(map.get(p2)+"---------------------");
        System.out.println(map.get(p3));


        // 比較p1 和 p2, 並打印它們的hashCode()
        System.out.printf("p1.equals(p2) : %s; p1(%d) p2(%d)\n", p1.equals(p2), p1.hashCode(), p2.hashCode());


    }

    /**
     * @desc Person類。
     */
    private static class Person {
        int age;
        String name;

        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public String toString() {
            return "("+name + ", " +age+")";
        }
    }
}

輸出結果:
woshi—p1---------------------
woshi—p2---------------------
我是P3
p1.equals(p2) : false; p1(821270929) p2(1160460865)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章