国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

Java集合框架匯總

2019-11-08 00:34:19
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

Java集合框架

HashMap是一個(gè)最常用的Map,它根據(jù)鍵的HashCode值存儲(chǔ)數(shù)據(jù),根據(jù)鍵可以直接獲取它的值,具有很快的訪問(wèn)速度,遍歷時(shí),取得數(shù)據(jù)的順序是完全隨的。HashMap最多只允許一條記錄的鍵為NULL,允許多條記錄的值為NUll。HashMap不支持線程的同步,即任意時(shí)刻可以有多個(gè)線程同時(shí)寫(xiě)HashMap;可能會(huì)導(dǎo)致數(shù)據(jù)的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。 1)HashMap的默認(rèn)大小為16,即桶數(shù)組的默認(rèn)長(zhǎng)度為16。 2)HashMap的默認(rèn)裝載因子為0.75。 3)HashMap內(nèi)部的桶數(shù)組存儲(chǔ)的是Entry對(duì)象,也就是鍵值對(duì)對(duì)象。 4)構(gòu)造器支持指定初始容量和裝載因子,為避免數(shù)組擴(kuò)容帶來(lái)的性能問(wèn)題,建議根據(jù)需求指定初始容量。裝載因子盡量不要修改,0.75是個(gè)比較靠譜的值。 5)桶數(shù)組的長(zhǎng)度始終是2的整數(shù)次方(大于等于指定的初始容量),這樣做可以減少?zèng)_突概率,提高查找效率。 6)HashMap接受null鍵。 7)HashMap不允許鍵重復(fù),但是值可以重復(fù),若鍵重復(fù),那么新值會(huì)覆蓋舊值。 8)HashMap通過(guò)鏈表法解決沖突問(wèn)題,每個(gè)Entry都有一個(gè)next指針指向下一個(gè)Entry,沖突元素(不是鍵相同,而是hash值相同)會(huì)構(gòu)成一個(gè)鏈表。并且最新插入的鍵值對(duì)始終位于鏈表首部。 9)當(dāng)容量超過(guò)閾值(threshold)時(shí),會(huì)發(fā)生擴(kuò)容,擴(kuò)容后的數(shù)組是原數(shù)組的兩倍。擴(kuò)容操作需要開(kāi)辟新數(shù)組,并對(duì)原數(shù)組中所有鍵值對(duì)重新散列,非常耗時(shí)。我們應(yīng)該盡量避免HashMap擴(kuò)容。 10)HashMap非線程安全。

Hashtable與HashMap類似,它繼承自Dictionary類,不同的是,它不允許記錄的鍵或者值為空;它支持線程的同步即任意時(shí)刻只有一個(gè)線程能寫(xiě)Hashtable,因此也導(dǎo)致了Hashtable在寫(xiě)入時(shí)會(huì)較慢;和HashMap一樣,Hashtable取得數(shù)據(jù)的順序也是無(wú)序的。 1)Hashtable是線程安全的類(HashMap非線程安全)。 2)Hashtable并不允許鍵和值為空(null),若為空,會(huì)拋出空指針(HashMap可以)。 3)Hashtable不允許鍵重復(fù),若鍵重復(fù),則新插入的值會(huì)覆蓋舊值(同HashMap)。 4)Hashtable同樣是通過(guò)鏈表法解決沖突的。 5)Hashtable根據(jù)hashcode計(jì)算索引時(shí)將hashcode值先與上0x7FFFFFFF,折是為了保證hash值始終為正數(shù)。 6)Hashtable的容量為任意正數(shù)(最小為1),而HashMap的容量始終為2的n次方。Hashtable默認(rèn)容量為11,HashMap的默認(rèn)容量為16。 7)Hashtable每次擴(kuò)容,新容量為舊容量的2倍加2,而HashMap為舊容量的2倍。 8)Hashtable和HashMap默認(rèn)負(fù)載因子都為0.75。

LinkedHashMap 1)LinkedHashMap繼承自HashMap,具有HashMap的大部分特性,比如支持null鍵和值,默認(rèn)容量為16,裝載因子為0.75,非線程安全等等。 2)LinkedHashMap通過(guò)設(shè)置accessOrder控制遍歷順序是按照插入順序(默認(rèn)為false)還是按照訪問(wèn)順序。當(dāng)accessOrder為true時(shí),可以利用其完成LRU緩存的功能。 3)LinkedHashMap內(nèi)部維護(hù)了一個(gè)雙向循環(huán)鏈表,并且其迭代操作是通過(guò)鏈表完成的,而不是去遍歷hash表。

TreeMap實(shí)現(xiàn)SortMap接口,取出來(lái)的是排序后的鍵值對(duì)。但如果您要按自然順序(默認(rèn),但是傳入的類必須實(shí)現(xiàn)comparable借口,否則拋出ClassCastException)或自定義順序(傳入比較器)遍歷鍵,那么TreeMap會(huì)更好。 1)TreeMap的實(shí)現(xiàn)基于紅黑樹(shù)。 2)TreeMap不允許插入null鍵,但允許null值。 3)TreeMap線程不安全。 4)插入結(jié)點(diǎn)時(shí),若鍵重復(fù),則新值覆蓋舊值。 5)TreeMap要求Key必須實(shí)現(xiàn)Comparable接口,或者初始化時(shí)傳入Comparator比較器。 6)遍歷TreeMap得到的結(jié)果集是有序的(中序遍歷);(紅黑樹(shù)是一種二叉排序樹(shù),而且是平衡樹(shù),中序遍歷結(jié)果就是自然排序結(jié)果)。 7)TreeMap的各項(xiàng)操作的平均時(shí)間復(fù)雜度為O(logn)。

HashSet,TreeSet,LinkedHashSet分別建立了一個(gè)對(duì)應(yīng)的HashMap,TreeMap,LinkedHashMap的實(shí)例,value存放的是同一個(gè)new Object(),方法完全調(diào)用對(duì)應(yīng)Map的方法。

StringBuffer和StringBuilder 1)StringBuilders jdk1.5引進(jìn)的,而StringBuffer在1.0就有了。 2)StringBuilder和StingBuffer都是可變的字符串,可以通過(guò)append或者insert等方法修改串的內(nèi)容。 3)StingBuffer是線程安全的,而StringBuilder不是,因而在多線程的環(huán)境下優(yōu)先使用StringBuffer,而其他情況下推薦使用StringBuilder,因?yàn)樗臁? 4)StringBuilder和StringBuffer都繼承自AbstractStingBuilder類,AbstractStringBuilder主要實(shí)現(xiàn)了擴(kuò)容、append、inset方法,StringBuilder和StringBuffer的相關(guān)方法都直接調(diào)用的父類。 5)StringBuilder和StringBuffer的初始容量都是16,程序員盡量手動(dòng)設(shè)置初始值,以避免多次擴(kuò)容所帶來(lái)的性能問(wèn)題。 6)StringBuilder和StringBuffer的擴(kuò)容機(jī)制:首先試著將當(dāng)前數(shù)組容量擴(kuò)充為原數(shù)組容量的2倍加上2,如果這個(gè)新容量仍然小于預(yù)定的最小值(minimunCapacity),那么久將新容量定為(minimumCapacity),最后判斷是否溢出,若溢出,則將容量定位整型的最大值0x7fffffff。

ArrayList 1)ArrayList內(nèi)部是通過(guò)一個(gè)Object數(shù)組實(shí)現(xiàn)的,當(dāng)數(shù)組填滿之后會(huì)根據(jù)需要進(jìn)行擴(kuò)容 2)最好預(yù)估ArrayList的大小,并設(shè)置其初始容量,以避免不必要的擴(kuò)容所造成的性能問(wèn)題。 3)ArrayList的初始容量是10,ArrayList每次擴(kuò)容都將容量變?yōu)樵瓉?lái)的1.5倍,若還小于所需的最小值,那么直接分配容量為所需值。 4)ArrayList線程不安全,允許空(null)的元素。 5)ArrayList內(nèi)部有兩個(gè)內(nèi)部類,分別實(shí)現(xiàn)Iterator和ListIterator,定義了迭代的規(guī)則。

LinkedList 1)LinkedList內(nèi)部通過(guò)雙向鏈表實(shí)現(xiàn)。 2)LinkedList線程不安全,支持null元素。 3)LinkedList插入刪除元素較方便,但是查找操作較耗時(shí)(對(duì)比ArrayList),雖然內(nèi)部進(jìn)行的優(yōu)化(根據(jù)位置選擇順序還是逆序遍歷,小于size>>2從頭開(kāi)始順序查找,否則從末尾開(kāi)始查找)。 4)LinkedList內(nèi)部同樣通過(guò)內(nèi)部類的形式實(shí)現(xiàn)了迭代器(僅實(shí)現(xiàn)了ListIterator,iterator方法返回的也是ListIterator對(duì)象)。 5)LinkedList實(shí)現(xiàn)了Deque接口,可以當(dāng)成棧,隊(duì)列,雙端隊(duì)列來(lái)使用。

Vector和Stack 1)Vector是線程安全的類而ArrayList不是; 2)Vector的擴(kuò)容基于擴(kuò)容增量,若擴(kuò)容增量不為0。每次擴(kuò)容的大小都為原始容量加上擴(kuò)容增量,若擴(kuò)容增量為0,也就是默認(rèn)的情況下,擴(kuò)容大小為元素容量的兩倍。 3)Vector默認(rèn)大小為10。 4)Vector支持null(ArrayList也可以)。 5)Vector出來(lái)可以使用listIterator和iterator遍歷集合,也可以使用Enumeration的方法遍歷。 6)Stack類繼承了Vector,并封裝了棧的操作,同時(shí)也是一個(gè)線程安全的類。 7)從性能上看,推薦使用ArrayList和LinkedList而不使用Vector和Stack。

轉(zhuǎn)自:http://svenliu.blog.163.com/blog/static/262873054201681743834691/


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 平顶山市| 泰安市| 城市| 福安市| 贵南县| 丹凤县| 沁阳市| 沾益县| 沛县| 潮安县| 蒲城县| 营山县| 新建县| 太和县| 漠河县| 西丰县| 怀仁县| 碌曲县| 前郭尔| 东明县| 三都| 通化市| 岑巩县| 英超| 伊川县| 宣威市| 曲水县| 外汇| 汉阴县| 安吉县| 当涂县| 和林格尔县| 南通市| 双江| 乐山市| 屏东县| 克什克腾旗| 长泰县| 措美县| 阳西县| 云安县|