更新時(shí)間:2020-07-13 15:23:33 來源:動(dòng)力節(jié)點(diǎn) 瀏覽2532次
請談一談,hashCode()和equals()方法的重要性體現(xiàn)在什么地方?
Java中的HashMap使用hashCode()和equals()方法來確定鍵值對的索引,當(dāng)根據(jù)鍵獲取值的時(shí)候也會(huì)用到這兩個(gè)方法。如果沒有正確的實(shí)現(xiàn)這兩個(gè)方法,兩個(gè)不同的鍵可能會(huì)有相同的hash值,因此,可能會(huì)被集合認(rèn)為是相等的。而且,這兩個(gè)方法也用來發(fā)現(xiàn)重復(fù)元素。所以這兩個(gè)方法的實(shí)現(xiàn)對HashMap的精確性和正確性是至關(guān)重要的。
請說一說,Java中的HashMap的工作原理是什么?
HashMap類有一個(gè)叫做Entry的內(nèi)部類。這個(gè)Entry類包含了key-value作為實(shí)例變量。每當(dāng)往hashmap里面存放key-value對的時(shí)候,都會(huì)為它們實(shí)例化一個(gè)Entry對象,這個(gè)Entry對象就會(huì)存儲在前面提到的Entry數(shù)組table中。Entry具體存在table的那個(gè)位置是根據(jù)key的hashcode()方法計(jì)算出來的hash值(來決定)。
介紹一下,什么是hashmap?
HashMap是一個(gè)散列表,它存儲的內(nèi)容是鍵值對(key-value)映射。HashMap繼承于AbstractMap,實(shí)現(xiàn)了Map、Cloneable、java.io.Serializable接口。HashMap的實(shí)現(xiàn)不是同步的,這意味著它不是線程安全的。它的key、value都可以為null。此外,HashMap中的映射不是有序的。
HashMap的實(shí)例有兩個(gè)參數(shù)影響其性能:“初始容量”和“加載因子”。容量是哈希表中桶的數(shù)量,初始容量只是哈希表在創(chuàng)建時(shí)的容量。加載因子是哈希表在其容量自動(dòng)增加之前可以達(dá)到多滿的一種尺度。當(dāng)哈希表中的條目數(shù)超出了加載因子與當(dāng)前容量的乘積時(shí),則要對該哈希表進(jìn)行rehash操作(即重建內(nèi)部數(shù)據(jù)結(jié)構(gòu)),從而哈希表將具有大約兩倍的桶數(shù)。通常,默認(rèn)加載因子是0.75,這是在時(shí)間和空間成本上尋求一種折衷。加載因子過高雖然減少了空間開銷,但同時(shí)也增加了查詢成本(在大多數(shù)HashMap類的操作中,包括get和put操作,都反映了這一點(diǎn))。在設(shè)置初始容量時(shí)應(yīng)該考慮到映射中所需的條目數(shù)及其加載因子,以便最大限度地減少rehash操作次數(shù)。如果初始容量大于最大條目數(shù)除以加載因子,則不會(huì)發(fā)生rehash操作。
hashmap共有4個(gè)構(gòu)造函數(shù):
//默認(rèn)構(gòu)造函數(shù)。HashMap()
//指定“容量大小”的構(gòu)造函數(shù)
HashMap(int capacity)
//指定“容量大小”和“加載因子”的構(gòu)造函數(shù)
HashMap(int capacity,float loadFactor)
//包含“子Map”的構(gòu)造函數(shù)
HashMap(Map<?extends K,?extends V>map)
講一講,如何構(gòu)造一致性哈希算法。
先構(gòu)造一個(gè)長度為232的整數(shù)環(huán)(這個(gè)環(huán)被稱為一致性Hash環(huán)),根據(jù)節(jié)點(diǎn)名稱的Hash值(其分布為[0,232-1])將服務(wù)器節(jié)點(diǎn)放置在這個(gè)Hash環(huán)上,然后根據(jù)數(shù)據(jù)的Key值計(jì)算得到其Hash值(其分布也為[0,232-1]),接著在Hash環(huán)上順時(shí)針查找距離這個(gè)Key值的Hash值最近的服務(wù)器節(jié)點(diǎn),完成Key到服務(wù)器的映射查找。
這種算法解決了普通余數(shù)Hash算法伸縮性差的問題,可以保證在上線、下線服務(wù)器的情況下盡量有多的請求命中原來路由到的服務(wù)器。
請問,Object作為HashMap的key的話,對Object有什么要求嗎?
要求Object中hashcode不能變。
請問hashset存的數(shù)是有序的嗎?
Hashset是無序的。
TreeMap和TreeSet在排序時(shí)如何比較元素?Collections工具類中的sort()方法如何比較元素?
TreeSet要求存放的對象所屬的類必須實(shí)現(xiàn)Comparable接口,該接口提供了比較元素的compareTo()方法,當(dāng)插入元素時(shí)會(huì)回調(diào)該方法比較元素的大小。TreeMap要求存放的鍵值對映射的鍵必須實(shí)現(xiàn)Comparable接口從而根據(jù)鍵對元素進(jìn)行排序。Collections工具類的sort方法有兩種重載的形式,第一種要求傳入的待排序容器中存放的對象比較實(shí)現(xiàn)Comparable接口以實(shí)現(xiàn)元素的比較;第二種不強(qiáng)制性的要求容器中的元素必須可比較,但是要求傳入第二個(gè)參數(shù),參數(shù)是Comparator接口的子類型(需要重寫compare方法實(shí)現(xiàn)元素的比較),相當(dāng)于一個(gè)臨時(shí)定義的排序規(guī)則,其實(shí)就是通過接口注入比較元素大小的算法,也是對回調(diào)模式的應(yīng)用(Java中對函數(shù)式編程的支持)。
以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對“企業(yè)常見的Java數(shù)據(jù)結(jié)構(gòu)面試題”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743