1.List的實現(xiàn)類有ArrayList,、LinkedList,、Vactor、Stack; ArrayList: 底層是動態(tài)數(shù)組結(jié)構(gòu),,數(shù)據(jù)查詢方便,、數(shù)據(jù)增刪改不方便,線程不安全,,本質(zhì)上就是通過定義新的更大的數(shù)組,,將舊數(shù)組內(nèi)容拷貝到新數(shù)組,來實現(xiàn)擴容,。 當我們調(diào)用無參構(gòu)造的方法來構(gòu)造ArrayList的對象時,,它會在內(nèi)部分配一個初始大小為10的Object類型的數(shù)組。 當添加的數(shù)據(jù)容量超過數(shù)組的大小時,,會產(chǎn)生一個新的數(shù)組,,新的數(shù)組大小為原數(shù)組的1.5倍,接著把原數(shù)組中的數(shù)據(jù)復(fù)制到新數(shù)組中,。
LinkedList: 底層是雙向鏈表結(jié)構(gòu),,數(shù)據(jù)增刪改方便,數(shù)據(jù)查詢不方便,,線程不安全,; 它內(nèi)部封裝的是雙向鏈表的數(shù)據(jù)結(jié)構(gòu),每個節(jié)點是一個Node對象,,Node對象中封裝的是你要添加的元素,,還有一個指向上一個Node對象的引用和一個指向下一個Node對象的引用。 每個節(jié)點都應(yīng)該有3部分內(nèi)容:
class Node {
Node previous; //前一個節(jié)點
Object element; //本節(jié)點保存的數(shù)據(jù)
Node next; //后一個節(jié)點
} Vactor: 底層是動態(tài)數(shù)組結(jié)構(gòu),,線程不安全,,和ArrayList類似,但屬于強同步類。 如果你的程序本身是線程安全的(thread-safe,沒有在多個線程之間共享同一個集合/對象),那么使用ArrayList是更好的選擇,。 當添加的數(shù)據(jù)容量超過數(shù)組的大小時,,會產(chǎn)生一個新的數(shù)組,新的數(shù)組大小為原數(shù)組的2倍,; 有句話叫越安全,,效率就越低,。
Stack: 底層是動態(tài)數(shù)組結(jié)構(gòu),線程安全,, Stack繼承自Vector,,實現(xiàn)一個后進先出的堆棧。Stack提供5個額外的方法使得Vector得以被當作堆棧使用,。 基本的push和pop 方法,,還有peek方法得到棧頂?shù)脑兀琫mpty方法測試堆棧是否為空,,search方法檢測一個元素在堆棧中的位置,。Stack剛創(chuàng)建后是空棧。
2.如何選用ArrayList,、LinkedList,、Vector?
線程安全時,用Vector,。 局部變量不存在線程安全問題時,,并且查找較多用ArrayList(一般使用它) 局部變量不存在線程安全問題時,,增加或刪除元素較多用LinkedList,。
3.List、set,、Map的區(qū)別 List: 1.可以允許重復(fù)的對象 2.可以插入多個null元素 3.是一個有序容器,,保持了每個元素的插入順序,輸出的順序就是插入的順序,。 4.常用的實現(xiàn)類有 ArrayList,、LinkedList 和 Vector。ArrayList 最為流行,,它提供了使用索引的隨意訪問,,而 LinkedList 則對于經(jīng)常需要從 List 中添加或刪除元素的場合更為合適。
Set: 1.不允許重復(fù)對象 2.無序容器,,你無法保證每個元素的存儲順序,,TreeSet通過 Comparator 或者 Comparable 維護了一個排序順序。 3.只允許一個 null 元素 4.Set接口最流行的幾個實現(xiàn)類是 HashSet,、LinkedHashSet 以及 TreeSet,。最流行的是基于 HashMap 實現(xiàn)的 HashSet;TreeSet 還實現(xiàn)了 SortedSet 接口,,因此 TreeSet 是一個根據(jù)其 compare() 和 compareTo() 的定義進行排序的有序容器,。
Map: 1.Map不是collection的子接口或者實現(xiàn)類。Map是一個接口,。 2.Map 的 每個 Entry 都持有兩個對象,,也就是一個鍵一個值,,Map 可能會持有相同的值對象但鍵對象必須是唯一的。 3. TreeMap 也通過 Comparator 或者 Comparable 維護了一個排序順序,。 4. Map 里你可以擁有隨意個 null 值但最多只能有一個 null 鍵,。 5.Map 接口最流行的幾個實現(xiàn)類是 HashMap、LinkedHashMap,、Hashtable 和 TreeMap,。(HashMap、TreeMap最常用)
4.什么場景下使用list,,set,,map呢?(或者會問為什么這里要用list,、或者set,、map,這里回答它們的優(yōu)缺點就可以了)
如果你經(jīng)常會使用索引來對容器中的元素進行訪問,,那么 List 是你的正確的選擇,。如果你已經(jīng)知道索引了的話,那么 List 的實現(xiàn)類比如 ArrayList 可以提供更快速的訪問,如果經(jīng)常添加刪除元素的,,那么肯定要選擇LinkedList,。 如果你想容器中的元素能夠按照它們插入的次序進行有序存儲,那么還是 List,,因為 List 是一個有序容器,,它按照插入順序進行存儲。 如果你想保證插入元素的唯一性,,也就是你不想有重復(fù)值的出現(xiàn),,那么可以選擇一個 Set 的實現(xiàn)類,比如 HashSet,、LinkedHashSet 或者 TreeSet,。所有 Set 的實現(xiàn)類都遵循了統(tǒng)一約束比如唯一性,而且還提供了額外的特性比如 TreeSet 還是一個 SortedSet,,所有存儲于 TreeSet 中的元素可以使用 Java 里的 Comparator 或者 Comparable 進行排序,。LinkedHashSet 也按照元素的插入順序?qū)λ鼈冞M行存儲。 如果你以鍵和值的形式進行數(shù)據(jù)存儲那么 Map 是你正確的選擇,。你可以根據(jù)你的后續(xù)需要從 Hashtable,、HashMap、TreeMap 中進行選擇,。
5.HashMap是線程安全的嗎,?為什么不是線程安全的?(最好畫圖說明多線程環(huán)境下不安全)并發(fā)環(huán)境下的rehash過程可能會帶來循環(huán)鏈表,,導(dǎo)致死循環(huán)致使線程掛掉
6.jdk1.7與jdk1.8中HashMap有什么不同,? 底層存儲模式不同
jdk1.7中HashMap是以數(shù)組+鏈表的模式存儲 jdk1.8中HashMap是以數(shù)組+鏈表+紅黑樹的模式存儲,,當同一個hash值(Table上元素)的鏈表節(jié)點數(shù)不小于8時,將不再以單鏈表的形式存儲了,, 會被調(diào)整成一顆紅黑樹,。
「IT技術(shù)之道」是國內(nèi)一家專注于技術(shù)交流分享的學習平臺,在這里你可以獲取海量的java,、Python,、前端等IT所有的學習資料,涵蓋了基礎(chǔ)技術(shù),、進階技能,、架構(gòu)設(shè)計、經(jīng)典書籍,。人生苦短,,我愿做您最忠實的技術(shù)支持伙伴!
|