請談一談,hashCode() 和equals() 方法的重要性體現(xiàn)在什么地方?
考察點:JAVA哈希表
參考回答:
Java中的HashMap使用hashCode()和equals()方法來確定鍵值對的索引,當根據(jù)鍵獲取值的時候也會用到這兩個方法。如果沒有正確的實現(xiàn)這兩個方法,兩個不同的鍵可能會有相同的hash值,因此,可能會被集合認為是相等的。而且,這兩個方法也用來發(fā)現(xiàn)重復元素。所以這兩個方法的實現(xiàn)對HashMap的精確性和正確性是至關(guān)重要的。
請說一說,Java中的HashMap的工作原理是什么?
考察點:JAVA哈希表
參考回答:
HashMap類有一個叫做Entry的內(nèi)部類。這個Entry類包含了key-value作為實例變量。 每當往hashmap里面存放key-value對的時候,都會為它們實例化一個Entry對象,這個Entry對象就會存儲在前面提到的Entry數(shù)組table中。Entry具體存在table的那個位置是 根據(jù)key的hashcode()方法計算出來的hash值(來決定)。
介紹一下,什么是hashmap?
考察點:哈希表
參考回答:
HashMap 是一個散列表,它存儲的內(nèi)容是鍵值對(key-value)映射。
HashMap 繼承于AbstractMap,實現(xiàn)了Map、Cloneable、java.io.Serializable接口。
HashMap 的實現(xiàn)不是同步的,這意味著它不是線程安全的。它的key、value都可以為null。此外,HashMap中的映射不是有序的。
HashMap 的實例有兩個參數(shù)影響其性能:“初始容量” 和 “加載因子”。容量 是哈希表中桶的數(shù)量,初始容量 只是哈希表在創(chuàng)建時的容量。加載因子 是哈希表在其容量自動增加之前可以達到多滿的一種尺度。當哈希表中的條目數(shù)超出了加載因子與當前容量的乘積時,則要對該哈希表進行 rehash 操作(即重建內(nèi)部數(shù)據(jù)結(jié)構(gòu)),從而哈希表將具有大約兩倍的桶數(shù)。
通常,默認加載因子是 0.75, 這是在時間和空間成本上尋求一種折衷。加載因子過高雖然減少了空間開銷,但同時也增加了查詢成本(在大多數(shù) HashMap 類的操作中,包括 get 和 put 操作,都反映了這一點)。在設(shè)置初始容量時應該考慮到映射中所需的條目數(shù)及其加載因子,以便最大限度地減少 rehash 操作次數(shù)。如果初始容量大于最大條目數(shù)除以加載因子,則不會發(fā)生 rehash 操作。
hashmap共有4個構(gòu)造函數(shù):
HashMap()
// 默認構(gòu)造函數(shù)。
HashMap(int capacity)
// 指定“容量大小”的構(gòu)造函數(shù)
HashMap(int capacity, float loadFactor)
// 指定“容量大小”和“加載因子”的構(gòu)造函數(shù)
HashMap(Map<? extends K, ? extends V> map)
// 包含“子Map”的構(gòu)造函數(shù)
講一講,如何構(gòu)造一致性 哈希算法。
考察點:哈希算法
參考回答:
先構(gòu)造一個長度為232的整數(shù)環(huán)(這個環(huán)被稱為一致性Hash環(huán)),根據(jù)節(jié)點名稱的Hash值(其分布為[0, 232-1])將服務器節(jié)點放置在這個Hash環(huán)上,然后根據(jù)數(shù)據(jù)的Key值計算得到其Hash值(其分布也為[0, 232-1]),接著在Hash環(huán)上順時針查找距離這個Key值的Hash值最近的服務器節(jié)點,完成Key到服務器的映射查找。
這種算法解決了普通余數(shù)Hash算法伸縮性差的問題,可以保證在上線、下線服務器的情況下盡量有多的請求命中原來路由到的服務器。
請問,Object作為HashMap的key的話,對Object有什么要求嗎?
考察點:哈希表
參考回答:
要求Object中hashcode不能變。
請問 hashset 存的數(shù)是有序的嗎?
考察點:哈希
參考回答:
Hashset是無序的。