哈希值
一個十進制的整數,由系統隨機給出(就是對象的地址值,是一個邏輯地址,模擬出來的地址,不是數據實際存儲的物理地址)數組
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.存儲數據到集合中,先計算元素的哈希值
2.若是數組中哈希值對應的鏈表數據掛載超過八位,鏈表便會轉成紅黑樹(爲了提升查詢的速度)
前提:存儲的元素必須重寫hashCode方法和equals方法。
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]