Java原始碼閱讀之HashMap(1)

2021-08-15 01:50:13 字數 2582 閱讀 2398

表結構的第一部分,hashmap。

/**

* hashmap是基於map介面的實現類,允許轉殖和序列化操作。

* hashmap是非執行緒安全的,鍵和值都允許為null,但是鍵為null的鍵值對會被放在最前面。

* hashmap不能保證儲存的鍵值對的順序是一直保持不變的。

* hashmap的操作效能與兩個因素有關,桶的大小和負載因子的大小,為了保證效能,請不要負載因子設定的過小,

* 或者在初始化的時候將桶設定的過大。

*/public class hashmapextends abstractmapimplements map, cloneable, serializable

public final k getkey()        

public final v getvalue()      

public final string tostring()

返回當前node的hash值

public final int hashcode()

public final v setvalue(v newvalue)

// 判斷當前節點與o是否相等,如果o和當前節點不是同乙個物件,必須兩者

// key和value同時相等才算o和當前節點相等

public final boolean equals(object o)

return false;}}

/*** 返回key的hash值

*/static final int hash(object key)

/*** 如果x實現了comparable介面,那麼返回x的類型別,否則返回null

*/static class<?> comparableclassfor(object x) }}

return null;

}/**

* 如果k和x屬於同乙個類的物件,返回k.compareto(x)的結果,否則返回0

*/@suppresswarnings() // for cast to comparable

static int comparecomparables(class<?> kc, object k, object x)

/*** 如果cap為2的冪,那麼返回cap否則返回大於cap的最小的乙個2的冪

*/static final int tablesizefor(int cap)

/*** hashmap初始化後首次使用儲存鍵值對的陣列。

*/transient node table;

/*** 用於存放鍵值對的集合

*/transient set> entryset;

/*** 當前物件包含的鍵值對數量。

*/transient int size;

/*** 這個集合被修改過的次數。

*/transient int modcount;

/*** 下乙個需要調整桶大小的值,當鍵值對數量達到此值時需要進行擴容(容量*負載因子)

*/   

int threshold;

/*** 負載因子,非預設

*/final float loadfactor;

/*** 建構函式,需要指定初始化桶大小和負載因子大小

*/public hashmap(int initialcapacity, float loadfactor)

/*** 建構函式,指定初始化桶大小

*/public hashmap(int initialcapacity)

/*** 建構函式,使用預設桶大小和預設負載因子

*/public hashmap()

/*** 使用m的鍵值對構造乙個新的hashmap物件,負載因子為預設負載因子,桶的大小為至少容納下m的鍵值對

*/public hashmap(map<? extends k, ? extends v> m)

/*** 將m中的鍵值對存入當前hashmap物件中

*/final void putmapentries(map<? extends k, ? extends v> m, boolean evict)

else if (s > threshold)

resize(); //如果m的大小大於下次擴容需要增加的空間,重新進行擴容

for (map.entry<? extends k, ? extends v> e : m.entryset()) }}

/*** 返回當前hashmap物件中儲存的鍵值對數量

*/public int size()

/*** 判斷當前hashmap物件是否為空

*/public boolean isempty()

/*** 給定key值,從當前hashmap物件中取出key對應的value值

*/public v get(object key)

/*** 根據給定的hash和key值獲取節點資訊,適用於hash衝突的時候

*/final nodegetnode(int hash, object key) while ((e = e.next) != null);}}

return null;

}

Java原始碼閱讀之Vector

vector與arraylist區別 protected object elementdata protected int elementcount protected int capacityincrement private static final int max array size int...

原始碼閱讀 Glide原始碼閱讀之with方法(一)

前言 本篇基於4.8.0版本 原始碼閱讀 glide原始碼閱讀之with方法 一 原始碼閱讀 glide原始碼閱讀之load方法 二 原始碼閱讀 glide原始碼閱讀之into方法 三 大多數情況下,我們使用glide 就一句 但是這一句 裡面蘊含著成噸的 with方法有以下幾個過載方法 publi...

原始碼閱讀 Glide原始碼閱讀之load方法(二)

原始碼閱讀 glide原始碼閱讀之load方法 二 原始碼閱讀 glide原始碼閱讀之into方法 三 首先,load方法有以下幾個過載方法 public requestbuilder load nullable bitmap bitmap public requestbuilder load nu...