千鋒教育Java入門全套視頻教程(java核心技術(shù),適合java零基礎(chǔ),Java

集合
List
list集合存放元素有序,可以重復(fù),線程不安全。
1.ArrayList:底層用的是一維數(shù)組,默認(rèn)容量為10,擴(kuò)容機(jī)制為原來(lái)的1.5倍。
2.LinkedList:底層使用的是雙向鏈表,
注意:ArrayList和LinkedList的比較主要在于底層不同,也就是數(shù)組跟鏈表進(jìn)行比較。
3.Vector:已被棄用了,底層也是數(shù)組,默認(rèn)容量為10,擴(kuò)容機(jī)制需要查看容量增量是否大于0,若大于0則為當(dāng)前長(zhǎng)度+容量增量,否則為原來(lái)的2倍。線程安全,當(dāng)效率低。
注意:ArrayList和Vector的區(qū)別:擴(kuò)容機(jī)制不同,線程安全不同。
4.Stack:先進(jìn)后出的原則,繼承了Vector,線程安全。
注意:區(qū)分Stack哪些方法會(huì)拋出異常和Stack的特殊方法。
Set
Set集合存放元素?zé)o序(無(wú)序不等于隨機(jī)),不允許重復(fù)。set的底層基本采用map。線程不安全。
1.HashSet:底層采用HashMap存放元素,Vaule存放同一個(gè)靜態(tài)的static obj = new Objetc();獲取到map的key單列集合。
2.TreeSet:底層采用TreeMap存放元素。
3.LinkedSet:底層采用LinkedMap存放元素。
Map
Map集合存放鍵值對(duì),
1.HashMap:底層采用entry數(shù)組(也就是hash表),entry里的屬性key、value、hash、next,容量必須為2的冪次方,默認(rèn)容量為16,默認(rèn)負(fù)載因子為0.75(取得時(shí)間與空間的平衡)。
存放元素的過(guò)程: 判斷是否初始化容器,判斷是否為空,為空則令下標(biāo)為0,并查看0上是否有元素,有則進(jìn)行遍歷,查看是否有相同元素,有則進(jìn)行替換value值,沒(méi)有則創(chuàng)建一個(gè)entry,進(jìn)行尾插法(jdk1.7用頭插法),key值不為空需要獲取hash值并在與高16位進(jìn)行按位異或,在與長(zhǎng)度減一進(jìn)行與運(yùn)算(使其元素更加均勻分布在哈希表中),再查看下標(biāo)上是否有元素,有需要遍歷,查看是否有key值是否有一樣的,有需要替換value,沒(méi)有相同key值,則創(chuàng)建一個(gè)entry,判斷容器是否需要擴(kuò)容(擴(kuò)容需要從新計(jì)算元素下標(biāo),用其hash值與新數(shù)組長(zhǎng)度進(jìn)行按位與運(yùn)算,判斷其是在原來(lái)的位置還是新位置,分成2個(gè)鏈表放入新數(shù)組中),再插入尾巴上。
2.TreeMap:采用紅黑樹(shù),需要一個(gè)比較器,進(jìn)行排序,不允許null鍵。
3.LinkedHashMap:采用雙向鏈表存放一個(gè)一個(gè)的entry對(duì)象和上一個(gè)下一個(gè),存放順序與取出順序一致。
4.ConcurrentHashMap:線程安全,JDK1.8CAS鎖。
5.HashTable:線程安全。已被棄用
注意ConcurrentHashMap和HashTable的區(qū)別:加鎖方式不同:ConcurrentHashMap采用JDK1.8CAS鎖(JDK1.7采用段位鎖),HashTable采用sychronized加鎖在方法上,效率低下。