- HashMap 的存取實(shí)現(xiàn)
// 存儲(chǔ)時(shí):
int hash = key.hashCode(); // 這個(gè)hashCode 方法這里不詳述穷遂,只要理解每個(gè)key的hash是一個(gè)固定的int值
int index=hash % Entry[].length;
Entry[index]=value;
// 取值時(shí)
int hash=key.hashCode();
int index=hash % Entry[].length;
return Entry[index];
1.1 put
public V put(K key, V value){
if(key==null)
return putForNullKey(value); //null 總是放在數(shù)組的第一個(gè)鏈表中
int hash=hash(key.hashCode());
int i=indexFor(hash,table.length);
// 遍歷鏈表
for(Entry<K,V> e=table[i];e!=null;e=e.next){
Object k;
// 如果key在鏈表中已經(jīng)存在,則替換為新value
if(e.hash==hash && ((k=e.key)==key||key.equals(k))){
V oldValue=e.value;
e.value=value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash,key,value,i);
return null;
}
void addEntry(int hash,k key, V value, int bucketIndex){
Entry<K,V> e=table[bucketIndex];
table[bucketIndex]= new Entry<K,V>(hash,key,value,e); // 參數(shù)e,是Entry.next
// 如果size超過threshold,則擴(kuò)充table大小娱据。再散列
if(size++>=threshold)
resize(2*table.length);
}