真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java中的hashCode方法如何用

這篇文章主要介紹“Java中的hashCode方法如何用”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“Java中的hashCode方法如何用”文章能幫助大家解決問(wèn)題。

創(chuàng)新互聯(lián)主要從事網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)京口,10多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):13518219792

1、介紹一下hashCode方法

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

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

  • 散列表存儲(chǔ)的是鍵值對(duì)(key-value),它的特點(diǎn)是:能根據(jù)“鍵”快速的檢索出對(duì)應(yīng)的“值”。這其中就利用到了散列碼?。梢钥焖僬业剿枰膶?duì)象)。

2、為什么需要hashCode方法?

在我們編寫程序的過(guò)程中,判斷兩個(gè)對(duì)象是否相同是十分常見(jiàn)且經(jīng)常面對(duì)的一個(gè)問(wèn)題。而 hashCode() 方法就是用來(lái)提升比較兩個(gè)對(duì)象的速度的。

我們就以“HashSet 如何檢查重復(fù)”為例子來(lái)說(shuō)明為什么要有 hashCode:

  • 當(dāng)你把對(duì)象加入 HashSet 時(shí),HashSet 會(huì)先計(jì)算對(duì)象的 hashcode 值來(lái)判斷對(duì)象加入的位置,同時(shí)也會(huì)與其他已經(jīng)加入的對(duì)象的 hashcode 值作比較,如果沒(méi)有相符的 hashcodeHashSet 會(huì)假設(shè)對(duì)象沒(méi)有重復(fù)出現(xiàn)。

  • 但是如果發(fā)現(xiàn)有相同 hashcode 值的對(duì)象,這時(shí)會(huì)調(diào)用 equals()方法來(lái)檢查 hashcode 相等的對(duì)象是否真的相同。如果兩者相同, HashSet 就不會(huì)讓其加入操作成功。如果不同的話,就會(huì)重新散列到其他位置。

  • 這樣我們就大大減少了 equals 的次數(shù),相應(yīng)就大大提高了執(zhí)行速度。

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

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

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

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

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

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

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

上面結(jié)論簡(jiǎn)記:

  • 如果兩個(gè)對(duì)象 equals,Java 運(yùn)行時(shí)環(huán)境會(huì)認(rèn)為他們的 hashCode 一定相等。

  • 如果兩個(gè)對(duì)象不 equals,他們的 hashCode 有可能相等。

  • 如果兩個(gè)對(duì)象 hashCode 相等,他們不一定 equals。

  • 如果兩個(gè)對(duì)象 hashCode 不相等,他們一定不 equals。

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

  • 我們上面講解到 如果 兩個(gè)對(duì)象 equals 的話,那么它們的 hashCode 值必然相等。如果只重寫了 equals 方法,而不重寫 hashCode 的方法,會(huì)造成 hashCode 的值不同,而 equals 方法判斷出來(lái)的結(jié)果為true

  • 在Java中的一些容器中,不允許有兩個(gè)完全相同的對(duì)象,插入的時(shí)候,如果判斷相同則會(huì)進(jìn)行覆蓋。這時(shí)候如果只重寫了 equals 的方法,而不重寫 hashCode 的方法,Object中 hashCode 是根據(jù)對(duì)象的存儲(chǔ)地址轉(zhuǎn)換而形成的一個(gè)哈希值。這時(shí)候就有可能因?yàn)闆](méi)有重寫 hashCode 方法,造成相同的對(duì)象散列到不同的位置而造成對(duì)象的不能覆蓋的問(wèn)題。

例如

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

測(cè)試類

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結(jié)果:" + dog.equals(dog1));
        System.out.println("dog 的 hashCode 值是否等于 dog1 的 hashCode 值:" +(dog.hashCode() == dog1.hashCode()));
    }
}

測(cè)試結(jié)果

equals結(jié)果:true
dog 的 hashCode 值是否等于 dog1 的 hashCode 值:false

關(guān)于“Java中的hashCode方法如何用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。


文章標(biāo)題:Java中的hashCode方法如何用
當(dāng)前地址:http://weahome.cn/article/pocedg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部