當(dāng)?shù)讓訉?shí)現(xiàn)涉及到擴(kuò)容時(shí),容器或重新分配一段更大的連續(xù)內(nèi)存(如果是離散分配則不需要重新分配牵舱,離散分配都是插入新元素時(shí)動(dòng)態(tài)分配內(nèi)存)串绩,要將容器原來(lái)的數(shù)據(jù)全部復(fù)制到新的內(nèi)存上,這無(wú)疑使效率大大降低仆葡。
加載因子的系數(shù)小于等于1赏参,意指??即當(dāng) 元素個(gè)數(shù) 超過(guò)?容量長(zhǎng)度*加載因子的系數(shù)?時(shí)志笼,進(jìn)行擴(kuò)容沿盅。
另外,擴(kuò)容也是有默認(rèn)的倍數(shù)的纫溃,不同的容器擴(kuò)容情況不同腰涧。
List?元素是有序的、可重復(fù)
ArrayList紊浩、Vector默認(rèn)初始容量為10
Vector:線程安全窖铡,但速度慢
底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組結(jié)構(gòu)
加載因子為1:即當(dāng) 元素個(gè)數(shù) 超過(guò) 容量長(zhǎng)度 時(shí),進(jìn)行擴(kuò)容
擴(kuò)容增量:原容量的 1倍
如?Vector的容量為10坊谁,一次擴(kuò)容后是容量為20
ArrayList:線程不安全费彼,查詢速度快
底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組結(jié)構(gòu)
擴(kuò)容增量:原容量的 0.5倍+1
如 ArrayList的容量為10,一次擴(kuò)容后是容量為16
Set(集)?元素?zé)o序的口芍、不可重復(fù)箍铲。
HashSet:線程不安全,存取速度快
底層實(shí)現(xiàn)是一個(gè)HashMap(保存數(shù)據(jù))鬓椭,實(shí)現(xiàn)Set接口
默認(rèn)初始容量為16(為何是16颠猴,見(jiàn)下方對(duì)HashMap的描述)
加載因子為0.75:即當(dāng) 元素個(gè)數(shù) 超過(guò) 容量長(zhǎng)度的0.75倍 時(shí),進(jìn)行擴(kuò)容
擴(kuò)容增量:原容量的 1 倍
如 HashSet的容量為16小染,一次擴(kuò)容后是容量為32
Map是一個(gè)雙列集合
HashMap:默認(rèn)初始容量為16,長(zhǎng)度始終保持2的n次方
∏涛汀(為何是16:16是2^4,可以提高查詢效率裤翩,另外资盅,32=16<<1???????-->至于詳細(xì)的原因可另行分析,或分析源代碼)
加載因子為0.75:即當(dāng) 元素個(gè)數(shù) 超過(guò) 容量長(zhǎng)度的0.75倍 時(shí),進(jìn)行擴(kuò)容
擴(kuò)容增量:原容量的 1 倍
如 HashMap的容量為16呵扛,一次擴(kuò)容后是容量為32
HashTable:默認(rèn)初始容量為11
線程安全振峻,但是速度慢,不允許key/value為null
加載因子為0.75:即當(dāng) 元素個(gè)數(shù) 超過(guò) 容量長(zhǎng)度的0.75倍 時(shí)择份,進(jìn)行擴(kuò)容
擴(kuò)容增量:2*原數(shù)組長(zhǎng)度+1
如 HashTable的容量為11扣孟,一次擴(kuò)容后是容量為23