雙列集合框架 Map

2022-02-07 20:40:31 字數 3922 閱讀 6425

1.常用實現類結構

|----map:雙列資料,儲存key-value對的資料 ---類似於高中的函式:y = f(x)

* |----hashmap:作為map的主要實現類;執行緒不安全的,效率高;儲存null的key和value

* |----linkedhashmap:保證在遍歷map元素時,可以照新增的順序實現遍歷。

* 原因:在原的hashmap底層結構基礎上,新增了一對指標,指向前乙個和後乙個元素。

* 對於頻繁的遍歷操作,此類執行效率高於hashmap。

* |----treemap:保證照新增的key-value對進行排序,實現排序遍歷。此時考慮key的自然排序或定製排序

* 底層使用紅黑樹

* |----hashtable:作為古老的實現類;執行緒安全的,效率低;不能儲存null的key和value

* |----properties:常用來處理配置檔案。key和value都是string型別**

* hashmap的底層:陣列+鍊錶 (jdk7及之前)

* 陣列+鍊錶+紅黑樹 (jdk 8)

2.儲存結構的理解

>map中的key:無序的、不可重複的,使用set儲存所的key ---> key所在的類要重寫equals()和hashcode() (以hashmap為例)

>map中的value:無序的、可重複的,使用collection儲存所的value --->value所在的類要重寫equals()

> 乙個鍵值對:key-value構成了乙個entry物件。

>map中的entry:無序的、不可重複的,使用set儲存所的entry

3.常用方法

* 新增:put(object key,object value)

* 刪除:remove(object key)

* 修改:put(object key,object value)

* 查詢:get(object key)

* 長度:size()

* 遍歷:keyset() / values() / entryset()

public

class

maptest

system.out.println("*******");

collection values =hash.values();

for(object obj: values)

system.out.println("*******");

set set1 =hash.entryset();

iterator iterator1 =set1.iterator();

while

(iterator1.hasnext())}}

4. 記憶體結構說明:(難點)

4.1 hashmap在jdk7中實現原理:

hashmap map = new hashmap():

* 在例項化以後,底層建立了長度是16的一維陣列entry table。

* ...可能已經執行過多次put...

* map.put(key1,value1):

* 首先,呼叫key1所在類的hashcode()計算key1雜湊值,此雜湊值經過某種演算法計算以後,得到在entry陣列中的存放位置。

* 如果此位置上的資料為空,此時的key1-value1新增成功。 ----情況1

* 如果此位置上的資料不為空,(意味著此位置上存在乙個或多個資料(以鍊錶形式存在)),比較key1和已經存在的乙個或多個資料的雜湊值:

* 如果key1的雜湊值與已經存在的資料的雜湊值都不相同,此時key1-value1新增成功。----情況2

* 如果key1的雜湊值和已經存在的某乙個資料(key2-value2)的雜湊值相同,繼續比較:呼叫key1所在類的equals(key2)方法,比較:

* 如果equals()返回false:此時key1-value1新增成功。----情況3

* 如果equals()返回true:使用value1替換value2。

** 補充:關於情況2和情況3:此時key1-value1和原來的資料以鍊錶的方式儲存。

** 在不斷的新增過程中,會涉及到擴容問題,當超出臨界值(且要存放的位置非空)時,擴容。預設的擴容方式:擴容為原來容量的2倍,並將原的資料複製過來。

4.2 hashmap在jdk8中相較於jdk7在底層實現方面的不同:

1. new hashmap():底層沒建立乙個長度為16的陣列

2. jdk 8底層的陣列是:node,而非entry

3. 首次呼叫put()方法時,底層建立長度為16的陣列

4. jdk7底層結構只:陣列+鍊錶。jdk8中底層結構:陣列+鍊錶+紅黑樹。

4.1 形成鍊錶時,七上八下(jdk7:新的元素指向舊的元素。jdk8:舊的元素指向新的元素)

4.2 當陣列的某乙個索引位置上的元素以鍊錶形式存在的資料個數 > 8 且當前陣列的長度 > 64時,此時此索引位置上的所資料改為使用紅黑樹儲存。

4.3hashmap底層典型屬性的屬性的說明

default_initial_capacity : hashmap的預設容量,16

default_load_factor:hashmap的預設載入因子:0.75

threshold:擴容的臨界值,=容量*填充因子:16 * 0.75 => 12

treeify_threshold:bucket中煉表長度大於該預設值,轉化為紅黑樹:8

min_treeify_capacity:桶中的node被樹化時最小的hash表容量:64

4.4 linkedhashmap的底層實現原理(了解)

linkedhashmap底層使用的結構與hashmap相同,因為linkedhashmap繼承於hashmap.

區別就在於:linkedhashmap內部提供了entry,替換hashmap中的node.

5. treemap的使用

//向treemap中新增key-value,要求key必須是由同乙個類建立的物件

//因為要照key進行排序:自然排序 、定製排序

6.使用properties讀取配置檔案

//

properties:常用來處理配置檔案。key和value都是string型別

public

static

void

main(string args)

catch

(ioexception e)

finally

catch

(ioexception e) }}

配置檔案  jdbc.properties

name=education

password=12345

原始碼分析文章

Map集合 雙列集合

map集合 雙列集合 map集合是鍵值對集合。它的元素是由兩個值組成的,元素的格式是 key value.map集合形式 map集合系列 map 介面 hashmap 實現類 linkedhashmap 注意 map集合只支援引用資料型別的元素儲存。map集合特點 鍵是無序不重複的。重複的鍵,後面加...

集合專題 雙列集合Map

一 map集合的常用方法 增和改put,刪除remove 查詢get 01.獲取鍵集put k key,v value hashmap string,integer map new hashmap map.put 李晨 28 map.put 王寶強 27 map.put 宋哲 18 map.put ...

Java集合 雙列集合Map

map集合 前面我們提到過的collection集合以及他的子實現類,這些集合屬於單列集合,而在實際開發中,經常使用到的還有雙列集合map集合。在具體講雙列集合之前,再來回憶一下單列集合。在單列集合中,首先分為list和set兩個集合,而list集合又分為 arraylist,vector,和lin...