HashMap實現原理,原始碼分析

2022-08-23 04:21:08 字數 2910 閱讀 8770

一、原始碼分析 

定義陣列的初始容量。

static

final

int default_initial_capacity = 1 << 4; //

aka 16

定義陣列最大容量

static

final

int maximum_capacity = 1 << 30;

定義負載因子預設值

static

final

float default_load_factor = 0.75f;

定義閾值預設值

static

final

int treeify_threshold = 8;

static

class nodeimplements map.entry

public

final k getkey()

public

final v getvalue()

public

final string tostring()

public

final

inthashcode()

public

final

v setvalue(v newvalue)

public

final

boolean

equals(object o)

return

false

; }

}

static

final

inthash(object key)

參考:

static

final

int tablesizefor(int

cap)

參考:

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

return

null

; }

comparableclassfor:hashmap類中有乙個comparableclassfor(object x)方法,當x的型別為x,且x直接實現了comparable介面(比較型別必須為x類本身)時,返回x的執行時型別;否則返回null。

instanceof

x instanceof comparable

instanceof 可以理解為某種型別的例項,無論是執行時型別,還是它的父類,它實現的介面,它的父類實現的介面,甚至它的父類的父類的父類實現的介面的父類的父類,總之,只要在繼承鏈上有這個型別就可以了。

getclass()

c = x.getclass()

與instanceof相應對的是getclass()方法,無論該物件如何轉型,getclass()返回的只會是它的執行時型別,可以簡單的理解為它的實際型別,也就是new它的時候的型別。 

有一種例外情況,匿名物件。當匿名物件呼叫getclass()時返回的是依賴它的物件的執行時型別,並以1,2,3…的索引區分。

public

class

demo .getclass()); //

class demo$1

system.out.println(new b(){}.getclass()); //

class demo$2

system.out.println(new comparable()}.getclass());

system.out.println(d.c.getclass());

//class d$1}}

abstract

class

a{}abstract

class

b{}abstract

class

c{}class

d; }

}

參考:resize:初始化table陣列或者擴容

final node resize() 

else

if ((newcap = oldcap << 1) < maximum_capacity &&oldcap >=default_initial_capacity)

newthr = oldthr << 1; //

double threshold

}

else

if (oldthr > 0) //

initial capacity was placed in threshold

newcap =oldthr;

else

if (newthr == 0)

threshold =newthr;

@suppresswarnings()

node

newtab = (node)new

node[newcap];

table =newtab;

if (oldtab != null

)

else

} while ((e = next) != null

);

if (lotail != null

)

if (hitail != null

) }}}

}return

newtab;

}

參考:

HashMap底層實現原理 原始碼

基於雜湊表的 map 介面的實現。此實現提供所有可選的對映操作,並允許使用null值 和 null鍵 檢視構造方法 預設初始的容量為16 arraylist預設初始值是 10 預設載入因子為0.75,什麼意思呢?就是說當資料元素達到容量的75 時,就會進行擴容 方法和map中的方法是一樣的 預設初始...

HashMap原始碼原理

hashmap原始碼解析 負載因子,樹化策略,內部hash實現,resize策略 內部屬性 負載因子 final float loadfactor 預設為0.75f 實際容量 int threshold loadfactor tab.length 樹化閾值 int treeify threshold...

Java中HashMap底層原理原始碼分析

在介紹hashmap的同時,我會把它和hashtable以及concurrenthashmap的區別也說一下,不過本文主要是介紹hashmap,其實它們的原理差不多,都是陣列加鍊表的形式儲存資料,另外本文所介紹的都是jdk1.8版本的。在介紹之前,先看下map家族的繼承體系圖 其中,treemap是...