91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中hashCode方法怎么用

發布時間:2022-04-08 13:33:25 來源:億速云 閱讀:420 作者:iii 欄目:開發技術

這篇文章主要介紹“Java中hashCode方法怎么用”,在日常操作中,相信很多人在Java中hashCode方法怎么用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java中hashCode方法怎么用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

1、介紹一下hashCode方法

  • hashCode() 的作用是獲取哈希碼,也稱為散列碼,它實際上是返回一個int整數。這個哈希碼的作用是確定該對象在哈希表中的索引位置。

  • hashCode() 定義在JDK的Object.java中,這就意味著Java中的任何類都包含有 hashCode() 函數。

  • 散列表存儲的是鍵值對(key-value),它的特點是:能根據“鍵”快速的檢索出對應的“值”。這其中就利用到了散列碼!(可以快速找到所需要的對象)。

2、為什么需要hashCode方法?

在我們編寫程序的過程中,判斷兩個對象是否相同是十分常見且經常面對的一個問題。而 hashCode() 方法就是用來提升比較兩個對象的速度的。

我們就以“HashSet 如何檢查重復”為例子來說明為什么要有 hashCode:

  • 當你把對象加入 HashSet 時,HashSet 會先計算對象的 hashcode 值來判斷對象加入的位置,同時也會與其他已經加入的對象的 hashcode 值作比較,如果沒有相符的 hashcodeHashSet 會假設對象沒有重復出現。

  • 但是如果發現有相同 hashcode 值的對象,這時會調用 equals()方法來檢查 hashcode 相等的對象是否真的相同。如果兩者相同, HashSet 就不會讓其加入操作成功。如果不同的話,就會重新散列到其他位置。

  • 這樣我們就大大減少了 equals 的次數,相應就大大提高了執行速度。

3、hashCode(),equals()兩種方法是什么關系?

Java 對于 eqauls() 方法和 hashCode() 方法是這樣規定的:

  • 同一對象上多次調用 hashCode() 方法,總是返回相同的整型值。

  • 如果 a.equals(b),則一定有 a.hashCode() 一定等于 b.hashCode()。

  • 如果 !a.equals(b),則 a.hashCode() 不一定等于 b.hashCode()。此時如果 a.hashCode() 總是不等于 b.hashCode(),會提高 hashtables 的性能。

  • a.hashCode()==b.hashCode() 則 a.equals(b) 可真可假

  • a.hashCode()!= b.hashCode() 則 a.equals(b) 為假。

上面結論簡記:

  • 如果兩個對象 equals,Java 運行時環境會認為他們的 hashCode 一定相等。

  • 如果兩個對象不 equals,他們的 hashCode 有可能相等。

  • 如果兩個對象 hashCode 相等,他們不一定 equals。

  • 如果兩個對象 hashCode 不相等,他們一定不 equals。

4、為什么重寫 equals 方法必須重寫 hashcode 方法 ??

  • 我們上面講解到 如果 兩個對象 equals 的話,那么它們的 hashCode 值必然相等。如果只重寫了 equals 方法,而不重寫 hashCode 的方法,會造成 hashCode 的值不同,而 equals 方法判斷出來的結果為true

  • 在Java中的一些容器中,不允許有兩個完全相同的對象,插入的時候,如果判斷相同則會進行覆蓋。這時候如果只重寫了 equals 的方法,而不重寫 hashCode 的方法,Object中 hashCode 是根據對象的存儲地址轉換而形成的一個哈希值。這時候就有可能因為沒有重寫 hashCode 方法,造成相同的對象散列到不同的位置而造成對象的不能覆蓋的問題。

例如

Dog類

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()));
    }
}

測試結果

equals結果:true
dog 的 hashCode 值是否等于 dog1 的 hashCode 值:false

到此,關于“Java中hashCode方法怎么用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

怀远县| 巩留县| 仲巴县| 佛学| 浦东新区| 鸡东县| 河津市| 渭源县| 九龙县| 临朐县| 顺昌县| 沙田区| 广丰县| 黄龙县| 古交市| 新密市| 延安市| 安平县| 怀远县| 大同市| 壶关县| 萍乡市| 海宁市| 如皋市| 洞头县| 博野县| 收藏| 江川县| 清镇市| 古蔺县| 泸州市| 郓城县| 侯马市| 保山市| 虹口区| 涞水县| 巩义市| 桃园市| 获嘉县| 昌宁县| 文安县|