一、hashmap原始碼分析
hashmap原始碼分析:
hashmap 底層是陣列加鍊表的形式
//hashmap預設的容量大小為16 必須是2的冪次方
static
final
int default_initial_capacity = 16;
//hashmap 2的冪次方容量 <= 1<<30
static
final
int maximum_capacity = 1
<< 30;
//預設負載係數 用於判斷hashmap什麼時候進擴容
static
final
float default_load_factor = 0.75f
//hashmap底層是entry陣列
transient entry table
//容量大小
transient
int size;
// threshold=容量*負載係數
int threshold;
// 負載係數
final
float loadfactor;
// the hashmap fail-fast 集合在遍歷時,不能進行修改,增加和刪除
transient
int modcount;
hashmap 建構函式
//無參建構函式 容量為預設的16 負載係數為0.75
public
hashmap()
//指定容量大小的 負載係數為0.75
public
hashmap(int initialcapacity)
//指定容量和負載係數
public
hashmap(int initialcapacity, float loadfactor)
hashmap 存入鍵值對
//put
public v put(k key, v value)
}modcount++;
addentry(hash, key, value, i);
return
null;
}//存入key為null的值
private v putfornullkey(v value)
}modcount++;
//則hash值為0 ,放在第乙個桶裡 返回null
addentry(0, null, value, 0);
return
null;
}//將新增元素放入到陣列中
void addentry(int hash, k key, v value, int bucketindex)
createentry(hash, key, value, bucketindex);
}//擴容
void resize(int newcapacity)
entry newtable = new entry[newcapacity];
boolean oldalthashing = usealthashing;
usealthashing |= sun.misc.vm.isbooted() &&
(newcapacity >= holder.alternative_hashing_threshold);
boolean rehash = oldalthashing ^ usealthashing;
//將舊陣列的元素轉移到新陣列中
transfer(newtable, rehash);
table = newtable;
threshold = (int)math.min(newcapacity * loadfactor, maximum_capacity + 1);
}//擴容後將舊陣列轉移到新陣列
void transfer(entry newtable, boolean rehash)
int i = indexfor(e.hash, newcapacity);
e.next = newtable[i];
newtable[i] = e;
e = next;}}
}// 確認元素存入桶的位置
static
int indexfor(int h, int length)
//新增元素進桶
void createentry(int hash, k key, v value, int bucketindex)
hashmap根據key獲取值
public v get(object key)
//如果key為null則去第乙個桶的,如果有在返回,沒有就返回null
private v getfornullkey()
return
null;
}//根據key獲取entry
final entrygetentry(object key)
return
null;
}
hashmap清空
public
void
clear()
判斷hashmap中是否包含value
public
boolean
containsvalue(object value)
hashmap 內部類 entry
static class entryimplements map.entry
}
總結:
1.hashmap底層是陣列和加鍊表的形式,元素都是存放在乙個乙個桶裡,以key的hash值和陣列的大小確認
2.hashmap預設的容量大小為16,負載係數為0.75 也就是當容量大小為12是,就會進行擴容,容量為原來的2倍,這方面平時需要注意,儘量減少擴容
3.hashmap中的entry分別存放了 key,value,本身,還有hash值
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...