1還是老習慣,一邊看,一邊新增注釋,希望堅持下去,hashmap的基本原始碼進行了分析,內部一些介面和設計還沒來得及看23
一、成員
45 1、transient
entry table;
67 hashmap內部維護了乙個內部類-entry,用來存放鍵值對,這個entry實現了map.entry這一map的內部介面entry,hashmap本質上來講是由陣列和entry鍊錶組成的資料結構
89 2、 static
final
float default_load_factor = 0.75f;
1011
載入因子,載入因子越大,hash表(即entry陣列)所佔空間越少,但會影響查詢效能(因為需要通過鍊錶乙個挨乙個向下查詢),載入因子越小,hash表(即entry陣列)所佔空間越多,這時查詢效率較高,但是hash表所佔空間較多
1213 3、static
final
int default_initial_capacity = 16;
1415 4、/**
1617
* the next size value at which to resize (capacity * load factor).
18*
@serial
19*/
20int
threshold;
2122 5、static
final
int maximum_capacity = 1 << 30;
2324 6、static
final
int default_initial_capacity = 16;
2526 7、final
float
loadfactor
2728
決定什麼時候進行擴容
2930
二、方法
3132 1、核心構造方法
3334
public hashmap(int initialcapacity, float
loadfactor)
5455 2、在key物件的hashcodr()方法的基礎上再做hash,避免一些不好的hashcode()方法
5657
//null keys always map to hash 0, 如果key為null,那麼hash()方法的到的hash值為0,再呼叫indexfor方法得到的陣列的索引值也為0,所以key為null的entry存在陣列下標為0的位置
5859
static
int hash(int
h) 66
67 3、根據2中獲得的hash值和陣列的長度得到entry對應的陣列的索引
6869
static
int indexfor(int h, int
length)
7273 4、根據key獲取value
7475
public
v get(object key)
86return
null;87
}8889 5、獲取key為null的key對應的值(注意:這裡使用在鍊錶中查詢的方式,因為index為0的鍊錶上不是只有key為null的entry)
9091
private
v getfornullkey()
96return
null;97
}9899 6、新增鍵值對
100101
public
v put(k key, v value)
116}
117118
/*如果key不存在則新增鍵值對
*/119
120 modcount++;
121addentry(hash, key, value, i);
122return
null
;123
}124
125 7、新增加鍵值對
126127
void addentry(int hash, k key, v value, int
bucketindex)
133134 8、擴容
135136
void resize(int
newcapacity)
143144 entry newtable = new entry[newcapacity]; //
擴容為新capacity
145 transfer(newtable); //
將所有的entry遷移到新的陣列中去
146 table =newtable;
147 threshold = (int)(newcapacity * loadfactor); //
重新計算閾值
148}
149150 9、將所有entry遷移到新陣列中
151152
void
transfer(entry newtable) while (e != null
);170
}171
}172 }
HashMap原始碼分析
public hashmap int initialcapacity,float loadfactor 2 接下來是重要的put方法,put方法用於將鍵值對儲存到map中,讓我們來具體分析一下。public v put k key,v value if key null 若key為null,則將va...
HashMap 原始碼分析
1 getentry object key 方法 final entrygetentry object key return null 根據key的hash值計算出索引,得到table中的位置,然後遍歷table處的鍊錶 for entrye table indexfor hash,table.le...
HashMap原始碼分析
public v put k key,v value if key null return putfornullkey value int hash hash key int i indexfor hash,table.length for entrye table i e null e e.nex...