久久精品国产99国产精品,农村大炕弄老女人,人马配速90分钟,香蕉成人伊视频在线观看

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

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

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

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

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

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

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

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

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

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

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

借個圖,如下:

而且LinkedHashMap有兩種迭代,一種是按插入順序排序(迭代時像隊列),另一種是按訪問排序(像棧一樣,最后一次訪問放在棧頭,可以實現(xiàn)為LRU)。

下面分析主要的源代碼:

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

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

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

2、看LinkedHashMap中的屬性:

LinkedHashMap中的主要屬性有三個heads,tail(維護(hù)鏈表的頭尾,很好理解),注釋accessOrder寫的很清楚,即訪問順序為真,插入順序為假;

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

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

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

(2)、獲取方法:

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

(3)、拆卸方法:

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

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

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

主站蜘蛛池模板: 岳池县| 辰溪县| 固原市| 女性| 莫力| 蓬溪县| 淳化县| 邹平县| 大邑县| 乌审旗| 满洲里市| 永川市| 株洲市| 井冈山市| 武隆县| 清苑县| 石棉县| 宣汉县| 文化| 平阳县| 垣曲县| 宁城县| 田东县| 湖北省| 平定县| 北安市| 荆门市| 惠安县| 蒙阴县| 观塘区| 伊吾县| 曲靖市| 铅山县| 凯里市| 江川县| 土默特右旗| 临漳县| 永宁县| 龙胜| 江永县| 泸溪县|