● hashmap是 map 介面使用頻率最高的實現類。*|--
--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型別
● 允許使用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...