- HashMap 的存取实现
// 存储时:
int hash = key.hashCode(); // 这个hashCode 方法这里不详述,只要理解每个key的hash是一个固定的int值
int index=hash % Entry[].length;
Entry[index]=value;
// 取值时
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 总是放在数组的第一个链表中
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在链表中已经存在,则替换为新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); // 参数e,是Entry.next
// 如果size超过threshold,则扩充table大小。再散列
if(size++>=threshold)
resize(2*table.length);
}
- refrence
hash map实现
hash map实现原理