java學習筆記(6)——哈希表

哈希表

哈希值
一個十進制的整數,由系統隨機給出(就是對象的地址值,是一個邏輯地址模擬出來的地址不是數據實際存儲的物理地址數組

Object類中的hashCode()方法能夠獲取哈希值
hashCode()源碼:spa

public native int hashCode();

native:表明該方法調用的是本地操做系統的方法操作系統

toString()的源碼:
裏面就包括hashCodecode

public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

String類也重寫了hashCode()方法,若是兩個字符串相同時,返回的hash值也相同對象

String str = new String("ssd2");
        String str2 = new String("ssd2");
        System.out.println(str.hashCode());
        System.out.println(str2.hashCode());

例外:當字符串爲 重地通話 時,他們的hashCode返回值相同blog

System.out.println("重地".hashCode());
        System.out.println("通話".hashCode());

哈希表

無序,不容許重複,速度快
HashSet集合存儲數據的結構字符串

在jdk1.8以前:哈希表 = 數組 + 鏈表get

在jdk1.8以後:源碼

哈希表 = 數組 + 鏈表
哈希表 = 數組 + 紅黑樹(提升查詢的速度)

數組結構:把元素進行了分組(相同哈希值的元素是一組)
鏈表 / 紅黑樹結構:把相同哈希值的元素鏈接到一塊兒hash

因爲數組查詢速度快,把相同哈希值放入數組中,能夠很快找到,這樣即可以獲得對應哈希值的數據。

1.存儲數據到集合中,先計算元素的哈希值
image.png

2.若是數組中哈希值對應的鏈表數據掛載超過八位,鏈表便會轉成紅黑樹(爲了提升查詢的速度)
image.png

image.png
前提:存儲的元素必須重寫hashCode方法和equals方法。

HashSet存儲自定義類型元素

LinkedHashSet

HashSet的子類
特色:
底層是一個哈希表(數組 + 鏈表 / 紅黑樹) + 鏈表
多了一條鏈表(記錄元素的存儲順序),保證元素有序
有序,不容許元素重複

LinkedHashSet<String> set1 = new LinkedHashSet<>();

        set1.add("abc");
        set1.add("aioehw");
        set1.add("abc");
        set1.add("dhf");
        System.out.println(set1);
        
   //[abc, aioehw, dhf]
相關文章
相關標籤/搜索