最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 超詳細(xì)講解hashCode方法

 更新時(shí)間:2022年04月07日 16:04:03   作者:崇尚學(xué)技術(shù)的科班人  
在 Java 應(yīng)用程序執(zhí)行期間,在同一對象上多次調(diào)用 hashCode 方法時(shí),必須一致地返回相同的整數(shù),前提是對象上 equals 比較中所用的信息沒有被修改。從某一應(yīng)用程序的一次執(zhí)行到同一應(yīng)用程序的另一次執(zhí)行,該整數(shù)無需保持一致

1、介紹一下hashCode方法

  • hashCode() 的作用是獲取哈希碼,也稱為散列碼,它實(shí)際上是返回一個int整數(shù)。這個哈希碼的作用是確定該對象在哈希表中的索引位置。
  • hashCode() 定義在JDK的Object.java中,這就意味著Java中的任何類都包含有 hashCode() 函數(shù)。
  • 散列表存儲的是鍵值對(key-value),它的特點(diǎn)是:能根據(jù)“鍵”快速的檢索出對應(yīng)的“值”。這其中就利用到了散列碼?。梢钥焖僬业剿枰膶ο螅?/li>

2、為什么需要hashCode方法?

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

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

  • 當(dāng)你把對象加入 HashSet 時(shí),HashSet 會先計(jì)算對象的 hashcode 值來判斷對象加入的位置,同時(shí)也會與其他已經(jīng)加入的對象的 hashcode 值作比較,如果沒有相符的 hashcode , HashSet 會假設(shè)對象沒有重復(fù)出現(xiàn)。
  • 但是如果發(fā)現(xiàn)有相同 hashcode 值的對象,這時(shí)會調(diào)用 equals()方法來檢查 hashcode 相等的對象是否真的相同。如果兩者相同, HashSet 就不會讓其加入操作成功。如果不同的話,就會重新散列到其他位置。
  • 這樣我們就大大減少了 equals 的次數(shù),相應(yīng)就大大提高了執(zhí)行速度。

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

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

  • 同一對象上多次調(diào)用 hashCode() 方法,總是返回相同的整型值。
  • 如果 a.equals(b),則一定有 a.hashCode() 一定等于 b.hashCode()。
  • 如果 !a.equals(b),則 a.hashCode() 不一定等于 b.hashCode()。此時(shí)如果 a.hashCode() 總是不等于 b.hashCode(),會提高 hashtables 的性能。
  • a.hashCode()==b.hashCode() 則 a.equals(b) 可真可假
  • a.hashCode()!= b.hashCode() 則 a.equals(b) 為假。

上面結(jié)論簡記:

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

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

  • 我們上面講解到 如果 兩個對象 equals 的話,那么它們的 hashCode 值必然相等。如果只重寫了 equals 方法,而不重寫 hashCode 的方法,會造成 hashCode 的值不同,而 equals 方法判斷出來的結(jié)果為true。
  • 在Java中的一些容器中,不允許有兩個完全相同的對象,插入的時(shí)候,如果判斷相同則會進(jìn)行覆蓋。這時(shí)候如果只重寫了 equals 的方法,而不重寫 hashCode 的方法,Object中 hashCode 是根據(jù)對象的存儲地址轉(zhuǎn)換而形成的一個哈希值。這時(shí)候就有可能因?yàn)闆]有重寫 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結(jié)果:" + dog.equals(dog1));
        System.out.println("dog 的 hashCode 值是否等于 dog1 的 hashCode 值:" +(dog.hashCode() == dog1.hashCode()));
    }
}

測試結(jié)果

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

到此這篇關(guān)于Java 超詳細(xì)講解hashCode方法的文章就介紹到這了,更多相關(guān)Java hashCode 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java8?Optional常用方法使用場景分析

    Java8?Optional常用方法使用場景分析

    這篇文章主要介紹了Java8?Optional常用方法使用場景,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Java中進(jìn)程與線程的區(qū)別

    Java中進(jìn)程與線程的區(qū)別

    這篇文章主要介紹了Java進(jìn)程與線程的區(qū)別,進(jìn)程(Process)是操作系統(tǒng)分配資源的基本單位,線程(Thread)是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的基本單位,下文更多兩者區(qū)別。需要的小伙伴可以參考一下
    2022-05-05
  • mybatis基本實(shí)例詳解

    mybatis基本實(shí)例詳解

    這篇文章主要介紹了mybatis基本實(shí)例詳解以及mybatis自由模糊查詢,代碼簡單易懂,非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-03-03
  • 實(shí)例講解分布式緩存軟件Memcached的Java客戶端使用

    實(shí)例講解分布式緩存軟件Memcached的Java客戶端使用

    這篇文章主要介紹了分布式緩存軟件Memcached的Java客戶端使用,Memcached在GitHub上開源,作者用其Windows平臺下的版本進(jìn)行演示,需要的朋友可以參考下
    2016-01-01
  • Java編程實(shí)現(xiàn)鄰接矩陣表示稠密圖代碼示例

    Java編程實(shí)現(xiàn)鄰接矩陣表示稠密圖代碼示例

    這篇文章主要介紹了Java編程實(shí)現(xiàn)鄰接矩陣表示稠密圖代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • SpringBoot詳細(xì)講解通過自定義classloader加密保護(hù)class文件

    SpringBoot詳細(xì)講解通過自定義classloader加密保護(hù)class文件

    這篇文章主要介紹了SpringBoot通過自定義classloader加密class文件,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • Java異常處理機(jī)制try catch流程詳解

    Java異常處理機(jī)制try catch流程詳解

    這篇文章主要介紹了Java異常處理機(jī)制try catch流程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 使用java + OpenCV破解頂象面積驗(yàn)證碼的示例

    使用java + OpenCV破解頂象面積驗(yàn)證碼的示例

    這篇文章主要介紹了使用java + OpenCV破解頂象面積驗(yàn)證碼的示例,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • java ssm框架實(shí)現(xiàn)分頁功能的示例代碼(oracle)

    java ssm框架實(shí)現(xiàn)分頁功能的示例代碼(oracle)

    這篇文章主要介紹了java ssm框架實(shí)現(xiàn)分頁功能的示例代碼(oracle),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • Spring整合Quartz分布式調(diào)度的示例代碼

    Spring整合Quartz分布式調(diào)度的示例代碼

    本篇文章主要介紹了Spring整合Quartz分布式調(diào)度的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04

最新評論

鹿邑县| 六盘水市| 汾阳市| 松原市| 龙川县| 兴宁市| 西和县| 兴隆县| 曲沃县| 武安市| 博乐市| 连山| 玛多县| 威宁| 达州市| 宿松县| 清河县| 彰化市| 平安县| 岳池县| 栾城县| 广东省| 新竹市| 来宾市| 茂名市| 大关县| 肃南| 延庆县| 富裕县| 读书| 双桥区| 东兴市| 宜章县| 穆棱市| 新乐市| 榆中县| 林芝县| 四子王旗| 龙州县| 徐州市| 阳西县|