卖逼视频免费看片|狼人就干网中文字慕|成人av影院导航|人妻少妇精品无码专区二区妖婧|亚洲丝袜视频玖玖|一区二区免费中文|日本高清无码一区|国产91无码小说|国产黄片子视频91sese日韩|免费高清无码成人网站入口

hashmap怎么刪除某個(gè)value hashmap實(shí)現(xiàn)了什么接口?

hashmap實(shí)現(xiàn)了什么接口?Map表示映射,接口指定了一組由鍵值對(duì)組織的集合。鍵必須是唯一的,并且映射中的數(shù)據(jù)可以 t被排序,即地圖中數(shù)據(jù)的順序與數(shù)據(jù)放置的順序無(wú)關(guān)。,它的基本操作是get和put,

hashmap實(shí)現(xiàn)了什么接口?

Map表示映射,接口指定了一組由鍵值對(duì)組織的集合。鍵必須是唯一的,并且映射中的數(shù)據(jù)可以 t被排序,即地圖中數(shù)據(jù)的順序與數(shù)據(jù)放置的順序無(wú)關(guān)。,它的基本操作是get和put,也就是put數(shù)據(jù)和fetch數(shù)據(jù),我們通常通過(guò)按鍵得到它對(duì)應(yīng)的valu

LinkdHashSet底層怎么實(shí)現(xiàn)元素有序?

從源代碼角度追根究底LinkedHashSet!

首先看看LinkedHashSet類(lèi)中的所有方法,發(fā)現(xiàn)都只是一些構(gòu)造方法,沒(méi)什么特別的。。spliterator方法只是一個(gè)迭代器!

從構(gòu)造函數(shù)中的超級(jí)方法點(diǎn)可以看出,構(gòu)造函數(shù)中的父構(gòu)造函數(shù)使用了LinkedHashMap進(jìn)行實(shí)例化,因此LinkedHashSet的特性必然與LinkedHashMap密切相關(guān),換句話說(shuō),LinkedHashSet的輸出順序來(lái)自于Linked HashMap

以下是對(duì)LinkedHashMap的詳細(xì)分析:

LinkedHashMap繼承HashMap并實(shí)現(xiàn)Map。顯然LinkedHashMap也被認(rèn)為是HashMap,保留了數(shù)組鏈表的結(jié)構(gòu)。至于順序的原因,肯定不會(huì)是因?yàn)镸ap接口和繼承HashMap,也就是說(shuō)LinkedHashMap的順序肯定是在LinkedHashMap類(lèi)中實(shí)現(xiàn)的。

Hashmap的底層數(shù)據(jù)結(jié)構(gòu)是將數(shù)組中的位置作為桶,在每個(gè)桶中放一個(gè)鏈表(或者紅黑樹(shù))。但是,hashCode落入的桶是不確定的,沒(méi)有相關(guān)性,所以HashMap可以 t以有序的輸出,而LinkedHashMap使用的是雙鏈表形式。存儲(chǔ)在Map中的數(shù)據(jù)不僅使用鏈表來(lái)維護(hù)每個(gè)桶中的順序,還維護(hù)每個(gè)值中的順序。

借個(gè)圖,如下:

而且LinkedHashMap有兩種迭代,一種是按插入順序排序(迭代時(shí)像隊(duì)列),另一種是按訪問(wèn)排序(像棧一樣,最后一次訪問(wèn)放在棧頭,可以實(shí)現(xiàn)為L(zhǎng)RU)。

下面分析主要的源代碼:

1、先看LinkedHashMap中的內(nèi)部類(lèi)條目:

Entry繼承自一個(gè)鍵值結(jié)構(gòu),比如Node對(duì)象中的hash、key和值,next用作hashMap中的同一個(gè)bucket。表面的條目指向,LinkedHashMap.entry新獲取這些屬性,并定義了兩個(gè)新的屬性,Entry before,after,用來(lái)維護(hù)所有條目的一個(gè)點(diǎn),成為一個(gè)雙向鏈表。

其余的內(nèi)部類(lèi),如LinkedKeyIterator和LinkedEntrySet,用作迭代器。

2、看LinkedHashMap中的屬性:

LinkedHashMap中的主要屬性有三個(gè)heads,tail(維護(hù)鏈表的頭尾,很好理解),注釋accessOrder寫(xiě)的很清楚,即訪問(wèn)順序?yàn)檎?,插入順序?yàn)榧伲?/p>

3,LinkedHashMap中的方法:①,put方法:我繞過(guò)LinkedHashMap,沒(méi)有 找不到put方法。是用的HashMap的put方法嗎?那條目鏈表是怎么做的呢?

從HashMap中的put方法可以看出,計(jì)算完哈希值后調(diào)用putVal方法,生成新插入的元素時(shí)使用newNode方法。LinkedHashMap不重寫(xiě)put方法,但重寫(xiě)newNode方法。從代碼中,我們可以看到HashMap中的newNode方法。只是簡(jiǎn)單的new返回一個(gè)節(jié)點(diǎn),LinkedHashMap中的newNode方法不僅添加了對(duì)象,還調(diào)用了linkNodeLast將對(duì)象掛在鏈表的尾節(jié)點(diǎn)上形成鏈表。(順便可以看出jdk中的數(shù)據(jù)結(jié)構(gòu)將多態(tài)特性(重寫(xiě)后調(diào)用子類(lèi)方法)運(yùn)用的淋漓盡致)

和newNode方法類(lèi)似的還有一個(gè)newTreeNode方法,也是在HashMap中的put方法中調(diào)用的,也就是紅黑樹(shù)結(jié)構(gòu);

(2)、獲取方法:

從get方法可以看出,如果accessOrder為false,那么LinkedHashMap使用的get方法與HashMap相同,計(jì)算對(duì)應(yīng)的哈希值,比較鍵值(,等于),如果匹配則返回。如果accessOrder為真,則調(diào)用afterNodeAccess方法判斷各種情況,然后將這個(gè)值設(shè)置為tail,保證是棧頭的位置,下次會(huì)先找到。代碼截圖如上!

(3)、拆卸方法:

LinkedHashMap中的remove方法和HashMap中的一樣,只是HashMap中最后一個(gè)afterNodeRemoval方法的方法體是空的,而在l。InkedHashMap被重寫(xiě),這個(gè)節(jié)點(diǎn)的最后一個(gè)節(jié)點(diǎn)連接到前一個(gè)節(jié)點(diǎn),相當(dāng)于解耦。。代碼如下:

一般來(lái)說(shuō),LinkedHashMap相比HashMap增加了鏈表特性,保持了元素的順序。雖然大多數(shù)方法使用HashMap方法,但是在LinkedHashMap中重寫(xiě)的多態(tài)特性是以不同的實(shí)現(xiàn)的??梢哉f(shuō)這是我們?cè)陂_(kāi)發(fā)代碼時(shí)應(yīng)該學(xué)習(xí)的,以后可以通過(guò)重寫(xiě)一些方法來(lái)擴(kuò)展其他類(lèi)型的HashMap!

LinkedHashMap說(shuō)到這里,作者已經(jīng)分享了很多java技術(shù),其中很多都幫助了一些朋友!會(huì)繼續(xù)分享,敬請(qǐng)關(guān)注。。。