Map介面的使用及相關知識點

2021-10-24 15:52:56 字數 3484 閱讀 7912

*|--

--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是 map 介面使用頻率最高的實現類。

● 允許使用null鍵和null值,與hashset一樣,不保證對映的順序。

● 所有的key構成的集合是set:無序的、不可重複的。所以,key所在的類要重寫:equals()和hashcode()

● 所有的value構成的集合是collection:無序的、可以重複的。所以,value所在的類要重寫:equals()

● 乙個key-value構成乙個entry

● 所有的entry構成的集合是set:無序的、不可重複的

● hashmap 判斷兩個 key 相等的標準是:兩個 key 通過 equals() 方法返回 true,hashcode 值也相等。

● hashmap 判斷兩個 value相等的標準是:兩個 value 通過 equals() 方法返回 true。

*      hashmap map =

newhashmap()

:* 在例項化以後,底層建立了長度是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倍,並將原有的

* 資料複製過來。

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

*1.newhashmap()

:底層沒有建立乙個長度為16的陣列

*2. jdk 8底層的陣列是:node[

],而非entry*

3. 首次呼叫put

()方法時,底層建立長度為16的陣列

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

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

4.2 當陣列的某乙個索引位置上的元素以鍊錶形式存在的資料個數 >

8 且當前陣列的長度 >

64時,此時此索引位置上的所資料改為使用

紅黑樹儲存。

* 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

*      原始碼:

*static

class

entry

extends

hashmap.node

}*

新增、刪除、修改操作:

●object put(object key,object value):將指定key-value新增到(或修改)當前map物件中

●void putall(map m):將m中的所有key-value對存放到當前map中

●object remove(object key):移除指定key的key-value對,並返回value

●void clear():清空當前map中的所有資料

元素查詢的操作:

●object get(object key):獲取指定key對應的value

●boolean containskey(object key):是否包含指定的key

●boolean containsvalue(object value):是否包含指定的value

●int size():返回map中key-value對的個數

●boolean isempty():判斷當前map是否為空

●boolean equals(object obj):判斷當前map和引數物件obj是否相等

元檢視操作的方法:

●set keyset():返回所有key構成的set集合

●collection values():返回所有value構成的collection集合

●set entryset():返回所有key-value對構成的set集合

Map介面知識點

map知識點 1 map介面 hashmap集合 linkedhashmap集合 2 map 雙列集合,collection 單列集合 3 hashmap 要保證鍵的唯 一 不重複,需要重寫鍵的hashcode 方法 equals 方法。4 linkedhashmap儲存順序一致 5 map 鍵ke...

抽象類及介面相關知識點

可宣告引用,更加純粹的使用多型。抽象方法 用abstract修飾的方法,沒有方法體,其訪問修飾符不能用private,因為抽象方法需要被繼承重寫,預設的default也不宜用,雖然編譯不會出錯,但是如果父子類不在同乙個包,則後患無窮。因此public以及protected可以使用,常用的是publi...

相關知識點

nweb inf uclasses uweb.xml ulib n 從httpservlet 繼承,重寫doget dopost方法 n部署web.xml n 只有乙個物件 n 第一次請求的時候被初始化,只一遍 n 初始化後先呼叫init 方法,只一遍 n 每個請求,呼叫一遍service serv...