list 下 arraylist ,linkedlist實(shí)現(xiàn)和區(qū)別
1.arraylist 使用的Object數(shù)組 温鸽,linkedlist是雙向鏈表
arraylist 增刪慢 狡逢, 查詢快,
linkedlist 增刪快 吼蚁, 查詢慢 ,
線程都不安全。
2.arraylist 擴(kuò)容
初始化是一個(gè)空數(shù)組税稼,
第一次擴(kuò)容為10.
每次擴(kuò)容之后都會(huì)變味原來的1.5倍左右
hashmap 實(shí)現(xiàn) ,擴(kuò)容
1.7之前是數(shù)組和鏈表 垮斯,采用頭插法
1.8之后鏈表長度大于8時(shí)郎仆,將鏈表轉(zhuǎn)為紅黑樹 ,如果數(shù)組長度小于64 兜蠕, 選擇數(shù)組擴(kuò)容扰肌,使用尾插法。
初始大小為16熊杨,HashMap中的元素個(gè)數(shù)之和大于負(fù)載因子*當(dāng)前容量的時(shí)候就要進(jìn)行擴(kuò)充曙旭,容量變?yōu)樵瓉淼?2 倍
設(shè)置初始容量(初始容量 = 預(yù)知數(shù)據(jù)量 / 加載因子)
線程不安全
HashMap擴(kuò)容的時(shí)候?yàn)槭裁词?的n次冪
(n-1)&hash
因?yàn)?操作除數(shù)是2的冪次等價(jià)于與除數(shù)減一的操作
hashmap put方法
key hash算法與與運(yùn)算得出
數(shù)組下標(biāo)為空時(shí) , node放入
數(shù)組下標(biāo)不為空時(shí)晶府,jdk1.7 jdk1.8
HashMap源碼中在計(jì)算hash值的時(shí)候?yàn)槭裁匆乙?6位
讓元素在HashMap中更加均勻的分布
線程安全的集合
Vector ,hashtable ,concurrenthashmap,
Stack
concurrenthashmap
1.7時(shí)使用分段鎖segment,每把鎖只鎖容器里部分?jǐn)?shù)據(jù)
1.8 node數(shù)組 + 鏈表 + 紅黑樹 并發(fā)用synchronized 和cas 桂躏, synchronized 只鎖當(dāng)前鏈表或紅黑二叉樹的首結(jié)點(diǎn)。
hashmap 和 hashtable區(qū)別
1.線程
2.空值
hashtable 不允許 null key null value
3.初始大小 hashtable 11 每次擴(kuò)容變?yōu)?2n+1
hashmap 16 變?yōu)閮杀?/p>
4.底層數(shù)據(jù)結(jié)構(gòu)
5.效率
hashmap 和 Treemap的區(qū)別
1.hash 無序 郊霎,tree 有序
2.hash 繼承 abstractmap tree 繼承 sortedmap