一、原始碼分析
定義陣列的初始容量。
staticfinal
int default_initial_capacity = 1 << 4; //
aka 16
定義陣列最大容量
staticfinal
int maximum_capacity = 1 << 30;
定義負載因子預設值
staticfinal
float default_load_factor = 0.75f;
定義閾值預設值
staticfinal
int treeify_threshold = 8;
staticclass 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
; }
}
staticfinal
inthash(object key)
參考:
staticfinal
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…的索引區分。
publicclass
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是...