三 HashMap原始碼分析

2021-07-24 14:05:08 字數 3050 閱讀 7931

一、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...