集合框架

集合分為單例集合與雙列集合

雙列集合的5種遍歷方式

import java.util.*;

public class day0 {

public static void main(String[] args) {

HashMap sm =new HashMap();

sm.put("abc","zhoguo");

sm.put("123","meiguo");

sm.put("555","yingguo");

//1.通過key獲取

? ? ? ? Set set = sm.keySet();

//自動迭代? item:迭代變量

? ? ? ? for (String item : set) {

System.out.println(item+"\t"+sm.get(item));

}

//2.通過value獲取

? ? ? ? Collection values = sm.values();

for (String value : values) {

System.out.println(value);

}

//3.key與value同時獲取

? ? ? ? Set> entrySet = sm.entrySet();

for (Map.Entry entry : entrySet) {

System.out.println(entry.getKey()+"\t"+entry.getValue());

}

//倆種while

? ? ? ? Iterator iterator = sm.keySet().iterator();

while (iterator.hasNext()){

String key = iterator.next();

System.out.println(key+"\t"+sm.get(key));

}

Iterator> iterator1 = sm.entrySet().iterator();

while (iterator1.hasNext()){

Map.Entry entry = iterator1.next();

System.out.println(entry.getKey()+"\t"+entry.getValue());

}

}

}

java的集合框架中,Collection接口是所有集合的根,然后擴展成三大類集合:

List:也就是有序集合,提供了方便的訪問,插入,刪除等操作

Set:set是不允許出現(xiàn)重復(fù)元素的

Queue/Deque:除了集合的基本功能外,還支持類似先入先出,或者后入先出等特定行為。通常是并發(fā)編程場合,再并發(fā)包中放著


單列集合自動擴容

所有語言中底層都是通過數(shù)組相互拷貝實現(xiàn)的

Vector:擴張成原來的2倍

ArrayList:擴容成原來的1.5倍

在實例化List的時候,jdk1.8中,默認的容量是0,在1.7與1.6中默認的是10,當通過add方法填入第一個元素時,元素為10

迭代器

迭代器是Iterator接口,有三個核心方法,維護指針可以向下移動next(),移動到指定位置后,取出當前位置的元素(next),以及重置指針操作remove

為什么數(shù)組和集合可以使用for循環(huán)進行迭代遍歷?

所有的數(shù)組和集合都實現(xiàn)了Iterable接口,該接口中只有一個方法,iterator方法,返回值類型是Iterable類型,在iterable中有三個方法,hasNest,next,和remove,最主要的是hasNext和next,在底層幫我們?nèi)ゾS護可以被迭代數(shù)組或集合的迭代

Map集合底層的數(shù)據(jù)結(jié)構(gòu)

List單列結(jié)構(gòu):底層是數(shù)組實現(xiàn)的

set和map底層是通過數(shù)組和鏈表實現(xiàn)的

hashset是以hashmap為基礎(chǔ)實現(xiàn)的

hashset保證元素的位于性,底層是通過hashCodde和equals結(jié)合實現(xiàn)的,在對比的過程中,先對比hashcode是否相同,然后對吧equals。

倆個對象是同一對象,hashcode一定相同,如果倆個對象hashcode值相同,不一定是同一個對象

hashmap底層是哈希列表,哈希列表中的哈希值

hashMap底層數(shù)據(jù)結(jié)構(gòu)

HasgMap是基于哈希表的Map接口的非同步實現(xiàn),此實現(xiàn)提供1所有可選的映射操作,并允許使用null值與null鍵,此類不保證映射的順序,特別是它不保證該順序永久不變

HashMap的數(shù)據(jù)結(jié)構(gòu)實際上是一個鏈表散列的數(shù)據(jù)結(jié)構(gòu),即數(shù)組和鏈表的結(jié)合體

HashMap基于Hash算法實現(xiàn)的,我們通過put存儲,get鍵賴獲取,當傳入key時,HashMap會根據(jù)key的hashCode()計算出hash值,根據(jù)hash值將value保存在bucket里,當計算出的hash值相同時,我們稱為hash沖突,HashMap的做法時用鏈表和紅黑樹存儲相同hash值得value。當hash沖突得個數(shù)比較少時,使用連表否則使用紅黑樹

線程安全得集合,HashTable,但HashTable訪問速度慢,底層用得Synchronized關(guān)鍵字。HashTable雖然線程安全,但他有性能問題有一個更好得集合,就是juc包下得ConcurrentHashMap得類型

ConcurrentHashMap與HashMap等得區(qū)別

1.HashMap:

HashMap底層是數(shù)組+鏈表實現(xiàn)得,是線程不安全得,在多線程環(huán)境下,使用Hashmap進行put操作會引起死循環(huán),導(dǎo)致cpu接近百分之百,所以在并發(fā)情況下不能使用HashMap

2.HashTable:

HashTable和hashMap得實現(xiàn)原理幾乎一樣,差別無非是HashTable不運行鍵和值為空,而hashmap允許,hashtable是線程安全得,但hashtable線程安全得策略實現(xiàn)代價太大,簡單粗暴,get/put所有相關(guān)操作都上鎖,多線程訪問時,只要有一個線程訪問,其他線程就只能阻塞

3.ConcurrentHashMap:

主要就是為了應(yīng)對hashmap在并發(fā)環(huán)境下不安全而誕生得,ConcurrentHashMap得設(shè)計與實現(xiàn)非常好,大量得利用了volatlle,final,CAS等lock-free技術(shù)來減少鎖帶來得影響


關(guān)于集合的幾個問題

1.簡述集合體系?

集合分為單列集合和雙列集合。

單列集合的頂層是Collection接口,包括List和Set集合。

List集合的特點是元素可重復(fù),有序,有索引,能夠有角標操作集合,有特有的迭代方式ListIterator。包括ArrayList、LinkedList和Vector。

ArrayList集合底層采用的是數(shù)組數(shù)據(jù)結(jié)構(gòu),查詢速度比較快,因為數(shù)組有索引,在內(nèi)存中分配的空間是連續(xù)的,但是增刪比較慢。線程不同步,效率高。初始容量為10。?

LinkedList集合的底層采用的是鏈表數(shù)據(jù)結(jié)構(gòu),增刪速度比較快,查詢速度比較慢。線程不同步。

Vector底層數(shù)據(jù)結(jié)構(gòu)也是數(shù)組數(shù)據(jù)結(jié)構(gòu),但是線程同步,效率低,特有取出元素的方式是枚舉。因為效率低,逐步被ArrayList替代。

Set集合的特點元素是無序的(存入和取出的順序不一致),元素不可以重復(fù)。包括HashSet和TreeSet。

HashSet的底層數(shù)據(jù)結(jié)構(gòu)是哈希表,線程不同步,效率高。保證元素的唯一性額有的依據(jù)是元素的hashCode和equals方法。如果hashCode不同,不調(diào)用equals方法。如果hashCode相同,才會調(diào)用equals方法判斷元素是否相同。?

TreeSet的底層數(shù)據(jù)結(jié)構(gòu)是二叉樹,線程不同步,效率高。能夠給元素進行排序。保證元素唯一性的依據(jù)是compareTo和return0。排序的兩種方式:第一種元素自身實現(xiàn)Comparable接口,重寫compareTo()方法。這種排序方式叫元素的自然排序,也叫默認排序。第二種是當元素自身不具備比較性或者具備的比較性不是所需要的,這時就讓集合自身具備比較性,當集合初始化時就有了比較性。定義一個比較器實現(xiàn)Comparator接口,重寫compare方法,定義集合的時候?qū)⒈容^器作為參數(shù)傳遞給TreeSet的構(gòu)造函數(shù),這樣集合就具有了比較性。

Map是雙列集合的頂層接口,該集合存儲的是鍵值對,一對一對的往里存,而且要保證鍵的唯一性。包括Hashtable、HashMap、TreeMap。

Hashtable的底層數(shù)據(jù)結(jié)構(gòu)是哈希表,不可以存儲null鍵和null值,線程同步,效率低。JDK1.0.

HashMap的底層數(shù)據(jù)結(jié)構(gòu)是哈希表,可以存儲null鍵和null值,線程不同步,將Hashtable替代,JDK1.2效率高。保證鍵的唯一性的依據(jù)是hashCode和equals方法。

TreeMap的底層數(shù)據(jù)結(jié)構(gòu)是二叉樹,線程不安全,能夠給集合中的鍵排序。

2.什么時候使用什么集合?

(1)首先要看是單列還是雙列,是單列的話就用Collection,雙列就用Map。

(2)要是單列的話看元素是不是要求重復(fù),元素重復(fù)的話使用List,看查詢多還是增刪多,查詢多的話用ArrayList,增刪多的話用LinkedList,不確定的話用ArrayList。不重復(fù)的話使用Set,看是否要求排序,排序的話用TreeSet,不需要排序用HashSet。不確定的話用HashSet。

(3)要是雙列的話,看是否要求排序,要求排序用TreeMap,不要求排序用HashMap,不確定的話用HashMap。

3.Collection(單列)和(Map)雙列的區(qū)別?

Collection是單列集合,Map是雙列集合。

Map的鍵是唯一的,Collection體系中的Set集合中的元素是唯一的。

Map集合的數(shù)據(jù)結(jié)構(gòu)針對鍵有效,Collection的底層數(shù)據(jù)結(jié)構(gòu)針對元素有效。

4.遍歷集合的方式有哪些?

遍歷List集合的方式有普通for、增強for、迭代器Iterator、列表迭代器ListIterator。

遍歷Set集合的方式有增強for、迭代器Iterator。

遍歷map集合的方式有keySet(),entrySet()。然后通過增強for、迭代器Iterator遍歷。

5.用迭代器和增強for遍歷集合,能否用集合的方法操作集合?

不能,會出現(xiàn)并發(fā)修改異常,ConcurrentModificationException。并發(fā)修改異常就是在用普通迭代器的時候用集合的方法增加、刪除元素。可以用列表迭代器。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容