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()
public4. 記憶體結構說明:(難點)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.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讀取配置檔案
//配置檔案 jdbc.propertiesproperties:常用來處理配置檔案。key和value都是string型別
public
static
void
main(string args)
catch
(ioexception e)
finally
catch
(ioexception e) }}
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...