久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

List的實現(xiàn)類有哪些,?它們的底層實現(xiàn)是怎樣完成的,?它們之間有什么區(qū)別?在什么時候選用什么樣的實現(xiàn)類...

 西北望msm66g9f 2018-08-12

IT技術(shù)之道

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ù)支持伙伴!


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多