1. 程式人生 > >java集合詳解和集合面試題目

java集合詳解和集合面試題目

一、集合與陣列

陣列(可以儲存基本資料型別)是用來存現物件的一種容器,但是陣列的長度固定,不適合在物件數量未知的情況下使用。

集合(只能儲存物件,物件型別可以不一樣)的長度可變,可在多數情況下使用。

二、層次關係

如圖所示:圖中,實線邊框的是實現類,折線邊框的是抽象類,而點線邊框的是介面

Collection介面是集合類的根介面,Java中沒有提供這個介面的直接的實現類。但是卻讓其被繼承產生了兩個介面,就是Set和ListSet中不能包含重複的元素。List是一個有序的集合,可以包含重複的元素,提供了按索引訪問的方式

Map是Java.util包中的另一個介面,它和Collection介面沒有關係,是相互獨立的,但是都屬於集合類的一部分。Map包含了key-value對。Map不能包含重複的key,但是可以包含相同的value

Iterator,所有的集合類,都實現了Iterator介面,這是一個用於遍歷集合中元素的介面,主要包含以下三種方法:
1.hasNext()是否還有下一個元素。
2.next()返回下一個元素。
3.remove()刪除當前元素。

三、幾種重要的介面和類簡介

1、List(有序、可重複)
List裡存放的物件是有序的,同時也是可以重複的,List關注的是索引,擁有一系列和索引相關的方法,查詢速度快。因為往list集合裡插入或刪除資料時,會伴隨著後面資料的移動,所有插入刪除資料速度慢。

2、Set(無序、不能重複)
Set裡存放的物件是無序,不能重複的,集合中的物件不按特定的方式排序,只是簡單地把物件加入集合中。

3、Map(鍵值對、鍵唯一、值不唯一)
Map集合中儲存的是鍵值對,鍵不能重複,值可以重複。根據鍵得到值,對map集合遍歷時先得到鍵的set集合,對set集合進行遍歷,得到相應的值。

對比如下:

是否有序

是否允許元素重複

Collection

List

Set

AbstractSet

HashSet

TreeSet

是(用二叉排序樹)

Map

AbstractMap

使用key-value來對映和儲存資料,key必須唯一,value可以重複

HashMap

TreeMap

是(用二叉排序樹)

四、遍歷

 在類集中提供了以下四種的常見輸出方式:

1)Iterator:迭代輸出,是使用最多的輸出方式。

2)ListIterator

:是Iterator的子介面,專門用於輸出List中的內容。

3)foreach輸出:JDK1.5之後提供的新功能,可以輸出陣列或集合。

4)for迴圈

程式碼示例如下:

 for的形式:forint i=0;i<arr.size();i++{...}

 foreach的形式: forintiarr{...}

 iterator的形式:
Iterator it = arr.iterator();
while(it.hasNext()){ object o =it.next(); ...}

五、ArrayList和LinkedList

ArrayList和LinkedList在用法上沒有區別,但是在功能上還是有區別的。LinkedList經常用在增刪操作較多而查詢操作很少的情況下,ArrayList則相反。

六、Map集合

實現類:HashMap、Hashtable、LinkedHashMap和TreeMap

HashMap 

HashMap是最常用的Map,它根據鍵的HashCode值儲存資料,根據鍵可以直接獲取它的值,具有很快的訪問速度,遍歷時,取得資料的順序是完全隨機的。因為鍵物件不可以重複,所以HashMap最多隻允許一條記錄的鍵為Null,允許多條記錄的值為Null,是非同步的

Hashtable

Hashtable與HashMap類似,是HashMap的執行緒安全版,它支援執行緒的同步,即任一時刻只有一個執行緒能寫Hashtable,因此也導致了Hashtale在寫入時會比較慢,它繼承自Dictionary類,不同的是它不允許記錄的鍵或者值為null,同時效率較低。

ConcurrentHashMap

執行緒安全,並且鎖分離。ConcurrentHashMap內部使用段(Segment)來表示這些不同的部分,每個段其實就是一個小的hash table,它們有自己的鎖。只要多個修改操作發生在不同的段上,它們就可以併發進行。

LinkedHashMap

LinkedHashMap儲存了記錄的插入順序,在用Iteraor遍歷LinkedHashMap時,先得到的記錄肯定是先插入的,在遍歷的時候會比HashMap慢,有HashMap的全部特性。

TreeMap

TreeMap實現SortMap介面,能夠把它儲存的記錄根據鍵排序,預設是按鍵值的升序排序(自然順序),也可以指定排序的比較器,當用Iterator遍歷TreeMap時,得到的記錄是排過序的。不允許key值為空,非同步的;

map的遍歷

第一種:KeySet()
將Map中所有的鍵存入到set集合中。因為set具備迭代器。所有可以迭代方式取出所有的鍵,再根據get方法。獲取每一個鍵對應的值。 keySet():迭代後只能通過get()取key 。
取到的結果會亂序,是因為取得資料行主鍵的時候,使用了HashMap.keySet()方法,而這個方法返回的Set結果,裡面的資料是亂序排放的。
典型用法如下:
Map map = new HashMap();
map.put("key1","lisi1");
map.put("key2","lisi2");
map.put("key3","lisi3");
map.put("key4","lisi4");  
//先獲取map集合的所有鍵的set集合,keyset()
Iterator it = map.keySet().iterator();
 //獲取迭代器
while(it.hasNext()){
Object key = it.next();
System.out.println(map.get(key));
}

第二種:entrySet()
Set<Map.Entry<K,V>> entrySet() //返回此對映中包含的對映關係的 Set 檢視。(一個關係就是一個鍵-值對),就是把(key-value)作為一個整體一對一對地存放到Set集合當中的。Map.Entry表示對映關係。entrySet():迭代後可以e.getKey(),e.getValue()兩種方法來取key和value。返回的是Entry介面。
典型用法如下:
Map map = new HashMap();
map.put("key1","lisi1");
map.put("key2","lisi2");
map.put("key3","lisi3");
map.put("key4","lisi4");
//將map集合中的對映關係取出,存入到set集合
Iterator it = map.entrySet().iterator();
while(it.hasNext()){
Entry e =(Entry) it.next();
System.out.println("鍵"+e.getKey () + "的值為" + e.getValue());
}
推薦使用第二種方式,即entrySet()方法,效率較高
對於keySet其實是遍歷了2次,一次是轉為iterator,一次就是從HashMap中取出key所對於的value。而entryset只是遍歷了第一次,它把key和value都放到了entry中,所以快了。兩種遍歷的遍歷時間相差還是很明顯的。

七、主要實現類區別小結

Vector和ArrayList
1,vector是執行緒同步的,所以它也是執行緒安全的,而arraylist是執行緒非同步的,是不安全的。如果不考慮到執行緒的安全因素,一般用arraylist效率比較高。
2,如果集合中的元素的數目大於目前集合陣列的長度時,vector增長率為目前陣列長度的100%,而arraylist增長率為目前陣列長度的50%。如果在集合中使用資料量比較大的資料,用vector有一定的優勢。
3,如果查詢一個指定位置的資料,vector和arraylist使用的時間是相同的,如果頻繁的訪問資料,這個時候使用vector和arraylist都可以。而如果移動一個指定位置會導致後面的元素都發生移動,這個時候就應該考慮到使用linklist,因為它移動一個指定位置的資料時其它元素不移動。
ArrayList 和Vector是採用陣列方式儲存資料,此陣列元素數大於實際儲存的資料以便增加和插入元素,都允許直接序號索引元素,但是插入資料要涉及到陣列元素移動等記憶體操作,所以索引資料快,插入資料慢,Vector由於使用了synchronized方法(執行緒安全)所以效能上比ArrayList要差,LinkedList使用雙向連結串列實現儲存,按序號索引資料需要進行向前或向後遍歷,但是插入資料時只需要記錄本項的前後項即可,所以插入數度較快。

arraylist和linkedlist
1.ArrayList是實現了基於動態陣列的資料結構,LinkedList基於連結串列的資料結構。
2.對於隨機訪問get和set,ArrayList覺得優於LinkedList,因為LinkedList要移動指標。
3.對於新增和刪除操作add和remove,LinedList比較佔優勢,因為ArrayList要移動資料。 這一點要看實際情況的。若只對單條資料插入或刪除,ArrayList的速度反而優於LinkedList。但若是批量隨機的插入刪除資料,LinkedList的速度大大優於ArrayList. 因為ArrayList每插入一條資料,要移動插入點及之後的所有資料。

HashMap與TreeMap
1、 HashMap通過hashcode對其內容進行快速查詢,而TreeMap中所有的元素都保持著某種固定的順序,如果你需要得到一個有序的結果你就應該使用TreeMap(HashMap中元素的排列順序是不固定的)。
2、在Map 中插入、刪除和定位元素,HashMap是最好的選擇。但如果您要按自然順序或自定義順序遍歷鍵,那麼TreeMap會更好。使用HashMap要求新增的鍵類明確定義了hashCode()和 equals()的實現。
兩個map中的元素一樣,但順序不一樣,導致hashCode()不一樣。
同樣做測試:
在HashMap中,同樣的值的map,順序不同,equals時,false;
而在treeMap中,同樣的值的map,順序不同,equals時,true,說明,treeMap在equals()時是整理了順序了的。

HashTable與HashMap
1、同步性:Hashtable是執行緒安全的,也就是說是同步的,而HashMap是執行緒序不安全的,不是同步的。
2、HashMap允許存在一個為null的key,多個為null的value 。

3、hashtable的key和value都不允許為null。

Java集合框架為Java程式語言的基礎,也是Java面試中很重要的一個知識點。這裡,我列出了一些關於Java集合的重要問題和答案。

1.Java集合框架是什麼?說出一些集合框架的優點?

    每種程式語言中都有集合,最初的Java版本包含幾種集合類:Vector、Stack、HashTable和Array。隨著集合的廣泛使用,Java1.2提出了囊括所有集合介面、實現和演算法的集合框架。在保證執行緒安全的情況下使用泛型和併發集合類,Java已經經歷了很久。它還包括在Java併發包中,阻塞介面以及它們的實現。集合框架的部分優點如下:

(1)使用核心集合類降低開發成本,而非實現我們自己的集合類。

(2)隨著使用經過嚴格測試的集合框架類,程式碼質量會得到提高。

(3)通過使用JDK附帶的集合類,可以降低程式碼維護成本。

(4)複用性和可操作性。

2.集合框架中的泛型有什麼優點?

    Java1.5引入了泛型,所有的集合介面和實現都大量地使用它。泛型允許我們為集合提供一個可以容納的物件型別,因此,如果你新增其它型別的任何元素,它會在編譯時報錯。這避免了在執行時出現ClassCastException,因為你將會在編譯時得到報錯資訊。泛型也使得程式碼整潔,我們不需要使用顯式轉換和instanceOf操作符。它也給執行時帶來好處,因為不會產生型別檢查的位元組碼指令。

3.Java集合框架的基礎介面有哪些?

    Collection為集合層級的根介面。一個集合代表一組物件,這些物件即為它的元素。Java平臺不提供這個介面任何直接的實現。

    Set是一個不能包含重複元素的集合。這個介面對數學集合抽象進行建模,被用來代表集合,就如一副牌。

    List是一個有序集合,可以包含重複元素。你可以通過它的索引來訪問任何元素。List更像長度動態變換的陣列。

    Map是一個將key對映到value的物件.一個Map不能包含重複的key:每個key最多隻能對映一個value。

    一些其它的介面有Queue、Dequeue、SortedSet、SortedMap和ListIterator。

4.為何Collection不從Cloneable和Serializable介面繼承?

    Collection介面指定一組物件,物件即為它的元素。如何維護這些元素由Collection的具體實現決定。例如,一些如List的Collection實現允許重複的元素,而其它的如Set就不允許。很多Collection實現有一個公有的clone方法。然而,把它放到集合的所有實現中也是沒有意義的。這是因為Collection是一個抽象表現。重要的是實現。

    當與具體實現打交道的時候,克隆或序列化的語義和含義才發揮作用。所以,具體實現應該決定如何對它進行克隆或序列化,或它是否可以被克隆或序列化。

    在所有的實現中授權克隆和序列化,最終導致更少的靈活性和更多的限制。特定的實現應該決定它是否可以被克隆和序列化。

5.為何Map介面不繼承Collection介面?

    儘管Map介面和它的實現也是集合框架的一部分,但Map不是集合,集合也不是Map。因此,Map繼承Collection毫無意義,反之亦然。

    如果Map繼承Collection介面,那麼元素去哪兒?Map包含key-value對,它提供抽取key或value列表集合的方法,但是它不適合“一組物件”規範。

6.Iterator是什麼?

    Iterator介面提供遍歷任何Collection的介面。我們可以從一個Collection中使用迭代器方法來獲取迭代器例項。迭代器取代了Java集合框架中的Enumeration。迭代器允許呼叫者在迭代過程中移除元素。

7.Enumeration和Iterator介面的區別?

    Enumeration的速度是Iterator的兩倍,也使用更少的記憶體。Enumeration是非常基礎的,也滿足了基礎的需要。但是,與Enumeration相比,Iterator更加安全,因為當一個集合正在被遍歷的時候,它會阻止其它執行緒去修改集合。

迭代器取代了Java集合框架中的Enumeration。迭代器允許呼叫者從集合中移除元素,而Enumeration不能做到。為了使它的功能更加清晰,迭代器方法名已經經過改善。

8.為何沒有像Iterator.add()這樣的方法,向集合中新增元素?

    語義不明,已知的是,Iterator的協議不能確保迭代的次序。然而要注意,ListIterator沒有提供一個add操作,它要確保迭代的順序。

9.為何迭代器沒有一個方法可以直接獲取下一個元素,而不需要移動遊標?

    它可以在當前Iterator的頂層實現,但是它用得很少,如果將它加到介面中,每個繼承都要去實現它,這沒有意義。

10.Iterater和ListIterator之間有什麼區別?

(1)我們可以使用Iterator來遍歷Set和List集合,而ListIterator只能遍歷List。

(2)Iterator只可以向前遍歷,而LIstIterator可以雙向遍歷。

(3)ListIterator從Iterator介面繼承,然後添加了一些額外的功能,比如新增一個元素、替換一個元素、獲取前面或後面元素的索引位置。

11.遍歷一個List有哪些不同的方式?

List<String> strList = new ArrayList<>();
//使用for-each迴圈
for(String obj : strList){
  System.out.println(obj);
}
//using iterator
Iterator<String> it = strList.iterator();
while(it.hasNext()){
  String obj = it.next();
  System.out.println(obj);
}

    使用迭代器更加執行緒安全,因為它可以確保,在當前遍歷的集合元素被更改的時候,它會丟擲ConcurrentModificationException。

12.通過迭代器fail-fast屬性,你明白了什麼?

    每次我們嘗試獲取下一個元素的時候,Iterator fail-fast屬性檢查當前集合結構裡的任何改動。如果發現任何改動,它丟擲ConcurrentModificationException。Collection中所有Iterator的實現都是按fail-fast來設計的(ConcurrentHashMap和CopyOnWriteArrayList這類併發集合類除外)。

13.fail-fast與fail-safe有什麼區別?

    Iterator的fail-fast屬性與當前的集合共同起作用,因此它不會受到集合中任何改動的影響。Java.util包中的所有集合類都被設計為fail-fast的,而java.util.concurrent中的集合類都為fail-safe的。Fail-fast迭代器丟擲ConcurrentModificationException,而fail-safe迭代器從不丟擲ConcurrentModificationException。

14.在迭代一個集合的時候,如何避免ConcurrentModificationException?

    在遍歷一個集合的時候,我們可以使用併發集合類來避免ConcurrentModificationException,比如使用CopyOnWriteArrayList,而不是ArrayList。

15.為何Iterator介面沒有具體的實現?

    Iterator介面定義了遍歷集合的方法,但它的實現則是集合實現類的責任。每個能夠返回用於遍歷的Iterator的集合類都有它自己的Iterator實現內部類。

這就允許集合類去選擇迭代器是fail-fast還是fail-safe的。比如,ArrayList迭代器是fail-fast的,而CopyOnWriteArrayList迭代器是fail-safe的。

16.UnsupportedOperationException是什麼?

    UnsupportedOperationException是用於表明操作不支援的異常。在JDK類中已被大量運用,在集合框架java.util.Collections.UnmodifiableCollection將會在所有add和remove操作中丟擲這個異常。

17.在Java中,HashMap是如何工作的?

    HashMap在Map.Entry靜態內部類實現中儲存key-value對。HashMap使用雜湊演算法,在put和get方法中,它使用hashCode()和equals()方法。當我們通過傳遞key-value對呼叫put方法的時候,HashMap使用Key hashCode()和雜湊演算法來找出儲存key-value對的索引。Entry儲存在LinkedList中,所以如果存在entry,它使用equals()方法來檢查傳遞的key是否已經存在,如果存在,它會覆蓋value,如果不存在,它會建立一個新的entry然後儲存。當我們通過傳遞key呼叫get方法時,它再次使用hashCode()來找到陣列中的索引,然後使用equals()方法找出正確的Entry,然後返回它的值。下面的圖片解釋了詳細內容。

    其它關於HashMap比較重要的問題是容量、負荷係數和閥值調整。HashMap預設的初始容量是32,負荷係數是0.75。閥值是為負荷係數乘以容量,無論何時我們嘗試新增一個entry,如果map的大小比閥值大的時候,HashMap會對map的內容進行重新雜湊,且使用更大的容量。容量總是2的冪,所以如果你知道你需要儲存大量的key-value對,比如快取從資料庫裡面拉取的資料,使用正確的容量和負荷係數對HashMap進行初始化是個不錯的做法。

18.hashCode()和equals()方法有何重要性?

    HashMap使用Key物件的hashCode()和equals()方法去決定key-value對的索引。當我們試著從HashMap中獲取值的時候,這些方法也會被用到。如果這些方法沒有被正確地實現,在這種情況下,兩個不同Key也許會產生相同的hashCode()和equals()輸出,HashMap將會認為它們是相同的,然後覆蓋它們,而非把它們儲存到不同的地方。同樣的,所有不允許儲存重複資料的集合類都使用hashCode()和equals()去查詢重複,所以正確實現它們非常重要。equals()和hashCode()的實現應該遵循以下規則:

(1)如果o1.equals(o2),那麼o1.hashCode() == o2.hashCode()總是為true的。

(2)如果o1.hashCode() == o2.hashCode(),並不意味著o1.equals(o2)會為true。

19.我們能否使用任何類作為Map的key?

    我們可以使用任何類作為Map的key,然而在使用它們之前,需要考慮以下幾點:

(1)如果類重寫了equals()方法,它也應該重寫hashCode()方法。

(2)類的所有例項需要遵循與equals()和hashCode()相關的規則。請參考之前提到的這些規則。

(3)如果一個類沒有使用equals(),你不應該在hashCode()中使用它。

(4)使用者自定義key類的最佳實踐是使之為不可變的,這樣,hashCode()值可以被快取起來,擁有更好的效能。不可變的類也可以確保hashCode()和equals()在未來不會改變,這樣就會解決與可變相關的問題了。

    比如,我有一個類MyKey,在HashMap中使用它。

//傳遞給MyKey的name引數被用於equals()和hashCode()中
MyKey key = new MyKey('Pankaj'); //assume hashCode=1234
myHashMap.put(key, 'Value');
// 以下的程式碼會改變key的hashCode()和equals()值
key.setName('Amit'); //assume new hashCode=7890
//下面會返回null,因為HashMap會嘗試查詢儲存同樣索引的key,而key已被改變了,匹配失敗,返回null
myHashMap.get(new MyKey('Pankaj'));

    那就是為何String和Integer被作為HashMap的key大量使用。

20.Map介面提供了哪些不同的集合檢視?

    Map介面提供三個集合檢視:

(1)Set keyset():返回map中包含的所有key的一個Set檢視。集合是受map支援的,map的變化會在集合中反映出來,反之亦然。當一個迭代器正在遍歷一個集合時,若map被修改了(除迭代器自身的移除操作以外),迭代器的結果會變為未定義。集合支援通過Iterator的Remove、Set.remove、removeAll、retainAll和clear操作進行元素移除,從map中移除對應的對映。它不支援add和addAll操作。

(2)Collection values():返回一個map中包含的所有value的一個Collection檢視。這個collection受map支援的,map的變化會在collection中反映出來,反之亦然。當一個迭代器正在遍歷一個collection時,若map被修改了(除迭代器自身的移除操作以外),迭代器的結果會變為未定義。集合支援通過Iterator的Remove、Set.remove、removeAll、retainAll和clear操作進行元素移除,從map中移除對應的對映。它不支援add和addAll操作。

(3)Set<Map.Entry<K,V>> entrySet():返回一個map鍾包含的所有對映的一個集合檢視。這個集合受map支援的,map的變化會在collection中反映出來,反之亦然。當一個迭代器正在遍歷一個集合時,若map被修改了(除迭代器自身的移除操作,以及對迭代器返回的entry進行setValue外),迭代器的結果會變為未定義。集合支援通過Iterator的Remove、Set.remove、removeAll、retainAll和clear操作進行元素移除,從map中移除對應的對映。它不支援add和addAll操作。

21.HashMap和HashTable有何不同?

(1)HashMap允許key和value為null,而HashTable不允許。

(2)HashTable是同步的,而HashMap不是。所以HashMap適合單執行緒環境,HashTable適合多執行緒環境。

(3)在Java1.4中引入了LinkedHashMap,HashMap的一個子類,假如你想要遍歷順序,你很容易從HashMap轉向LinkedHashMap,但是HashTable不是這樣的,它的順序是不可預知的。

(4)HashMap提供對key的Set進行遍歷,因此它是fail-fast的,但HashTable提供對key的Enumeration進行遍歷,它不支援fail-fast。

(5)HashTable被認為是個遺留的類,如果你尋求在迭代的時候修改Map,你應該使用CocurrentHashMap。

22.如何決定選用HashMap還是TreeMap?

    對於在Map中插入、刪除和定位元素這類操作,HashMap是最好的選擇。然而,假如你需要對一個有序的key集合進行遍歷,TreeMap是更好的選擇。基於你的collection的大小,也許向HashMap中新增元素會更快,將map換為TreeMap進行有序key的遍歷。

23.ArrayList和Vector有何異同點?

    ArrayList和Vector在很多時候都很類似。

(1)兩者都是基於索引的,內部由一個數組支援。

(2)兩者維護插入的順序,我們可以根據插入順序來獲取元素。

(3)ArrayList和Vector的迭代器實現都是fail-fast的。

(4)ArrayList和Vector兩者允許null值,也可以使用索引值對元素進行隨機訪問。

    以下是ArrayList和Vector的不同點。

(1)Vector是同步的,而ArrayList不是。然而,如果你尋求在迭代的時候對列表進行改變,你應該使用CopyOnWriteArrayList。

(2)ArrayList比Vector快,它因為有同步,不會過載。

(3)ArrayList更加通用,因為我們可以使用Collections工具類輕易地獲取同步列表和只讀列表。

24.Array和ArrayList有何區別?什麼時候更適合用Array?

    Array可以容納基本型別和物件,而ArrayList只能容納物件。

    Array是指定大小的,而ArrayList大小是固定的。

    Array沒有提供ArrayList那麼多功能,比如addAll、removeAll和iterator等。儘管ArrayList明顯是更好的選擇,但也有些時候Array比較好用。

(1)如果列表的大小已經指定,大部分情況下是儲存和遍歷它們。

(2)對於遍歷基本資料型別,儘管Collections使用自動裝箱來減輕編碼任務,在指定大小的基本型別的列表上工作也會變得很慢。

(3)如果你要使用多維陣列,使用[][]比List<List<>>更容易。

25.ArrayList和LinkedList有何區別?

    ArrayList和LinkedList兩者都實現了List介面,但是它們之間有些不同。

(1)ArrayList是由Array所支援的基於一個索引的資料結構,所以它提供對元素的隨機訪問,複雜度為O(1),但LinkedList儲存一系列的節點資料,每個節點都與前一個和下一個節點相連線。所以,儘管有使用索引獲取元素的方法,內部實現是從起始點開始遍歷,遍歷到索引的節點然後返回元素,時間複雜度為O(n),比ArrayList要慢。

(2)與ArrayList相比,在LinkedList中插入、新增和刪除一個元素會更快,因為在一個元素被插入到中間的時候,不會涉及改變陣列的大小,或更新索引。

(3)LinkedList比ArrayList消耗更多的記憶體,因為LinkedList中的每個節點儲存了前後節點的引用。

26.哪些集合類提供對元素的隨機訪問?

    ArrayList、HashMap、TreeMap和HashTable類提供對元素的隨機訪問。

27.EnumSet是什麼?

    java.util.EnumSet是使用列舉型別的集合實現。當集合建立時,列舉集合中的所有元素必須來自單個指定的列舉型別,可以是顯示的或隱示的。EnumSet是不同步的,不允許值為null的元素。它也提供了一些有用的方法,比如copyOf(Collection c)、of(E first,E…rest)和complementOf(EnumSet s)。

28.哪些集合類是執行緒安全的?

    Vector、HashTable、Properties和Stack是同步類,所以它們是執行緒安全的,可以在多執行緒環境下使用。Java1.5併發API包括一些集合類,允許迭代時修改,因為它們都工作在集合的克隆上,所以它們在多執行緒環境中是安全的。

29.併發集合類是什麼?

    Java1.5併發包(java.util.concurrent)包含執行緒安全集合類,允許在迭代時修改集合。迭代器被設計為fail-fast的,會丟擲ConcurrentModificationException。一部分類為:CopyOnWriteArrayList、 ConcurrentHashMap、CopyOnWriteArraySet。

30.BlockingQueue是什麼?

    Java.util.concurrent.BlockingQueue是一個佇列,在進行檢索或移除一個元素的時候,它會等待佇列變為非空;當在新增一個元素時,它會等待佇列中的可用空間。BlockingQueue介面是Java集合框架的一部分,主要用於實現生產者-消費者模式。我們不需要擔心等待生產者有可用的空間,或消費者有可用的物件,因為它都在BlockingQueue的實現類中被處理了。Java提供了集中BlockingQueue的實現,比如ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue,、SynchronousQueue等。

31.佇列和棧是什麼,列出它們的區別?

    棧和佇列兩者都被用來預儲存資料。java.util.Queue是一個介面,它的實現類在Java併發包中。佇列允許先進先出(FIFO)檢索元素,但並非總是這樣。Deque介面允許從兩端檢索元素。

棧與佇列很相似,但它允許對元素進行後進先出(LIFO)進行檢索。

相關推薦

java集合集合面試題目

一、集合與陣列陣列(可以儲存基本資料型別)是用來存現物件的一種容器,但是陣列的長度固定,不適合在物件數量未知的情況下使用。集合(只能儲存物件,物件型別可以不一樣)的長度可變,可在多數情況下使用。二、層次關係如圖所示:圖中,實線邊框的是實現類,折線邊框的是抽象類,而點線邊框的是

java註解自定義註解

本文首先介紹了註解的基本概念和JDK內建的標準註解,然後介紹瞭如何自定義註解,最後給出了自定義註解的例子。 一、註解的基本概念 Java 註解就像修飾符一樣,可以用於從java程式碼中抽取文件、跟蹤程式碼中的依賴性或者在編譯時做檢查。註解可以被應用在包、類、

http協議及htt面試題目,常見的http狀態碼

HTTP報文是面向文字的,報文中的每一個欄位都是一些ASCII碼串,各個欄位的長度是不確定的。HTTP有兩類報文:請求報文和響應報文。 HTTP請求報文 一個HTTP請求報文由請求行(request line)、請求頭部(header)、空行和請求資料4個部分組成,下

Java集合2:LinkedListQueue

這位大俠,這是我的公眾號:程式設計師江湖。 分享程式設計師面試與技術的那些事。 乾貨滿滿,關注就送。 今天我們來探索一下LinkedList和Queue,以及Stack的原始碼。 具體程式碼在我的GitHub中可以找到 喜歡的話麻煩star一下哈

Java集合5:深入理解LinkedHashMapLRU緩存

last pic p s iat 能夠 access 鏈接 數組 ner Java集合詳解5:深入理解LinkedHashMap和LRU緩存 今天我們來深入探索一下LinkedHashMap的底層原理,並且使用linkedhashmap來實現LRU緩存。 具體代碼在我的Gi

Java集合4:HashMapHashTable

var strong 大表 Java後端 們的 col keyword 創建 spl Java集合詳解4:HashMap和HashTable 今天我們來探索一下HashMap和HashTable機制與比較器的源碼。 具體代碼在我的GitHub中可以找到 https://gi

Java中的集合,結合 ArrayList、HashSet 的區別以及HashCode的作用。

Java中的集合:      (1)Collection                           List(有序,可重複)             ArrayList         

java 集合及如何應用

1、結構圖                 2、集合對比說明   有序 允許元素重複 同步 描述

Java Set集合及Set與List的區別

Java中的Set集合是繼承Collection的介面,是一個不包含重複元素的集合。     下圖是Set集合的原始碼。 Set和List都是以介面都形式來進行宣告。Set主要包含三種存放資料型別都變數,分別是HashSet,LinkedHashSet,TreeSet

JAVA學習篇14——集合

概述: List , Set, Map都是介面,前兩個繼承至Collection介面,Map為獨立介面 Set下有HashSet,LinkedHashSet,TreeSet List下有ArrayList,Vector,LinkedList Map下有Hashta

Java集合

一、陣列和集合的比較 陣列不是面向物件的,存在明顯的缺陷,集合彌補了陣列的缺點,比陣列更靈活更實用,而且不同的集合框架類可適用不同場合。如下: 1:陣列能存放基本資料型別和物件,而集合類存放的都是物件的引用,而非物件本身! 2:陣列容易固定無法動態改變,集合類容量動態改變。

Java集合--什麼是集合

什麼是集合 集合類存放於java.util包中。 集合類存放的都是物件的引用,而非物件本身,出於表達上的便利,我們稱集合中的物件就是指集合中物件的引用(reference)。 集合型別主要有3種:set(集)、list(列表)和map(對映)。 通俗

集合Java集合總結(下)-常用集合類對比

今天我們主要看一張圖。 圖是無意中在網上發現的,個人覺得非常好。(時間久了就忘了出處,請原創原諒~~) 我們還是從左到右分析。 ①所有的類都用到Iterator則說明所有的集合類都有遍歷集合的方法。 ②LinkedList除了繼承AbstractSe

Java集合--什麼是Set

簡述 Set和List一樣,也繼承於Collection,是集合的一種。和List不同的是,Set內部實現是基於Map的,所以Set取值時不保證資料和存入的時候順序一致,並且不允許空值,不允許重複值。 然後我們來看下Set的繼承結構 可以看出,

Java集合--什麼是Map

引言 在很久很久以前,講過Set的實現原理,講到Set就是Map的馬甲,那麼今天我們就來看看Map是如何實現的(本文都基於JDK1.8的版本) 什麼是Map Map和Collection有關的幾個map的關係圖 Map的定義

Java程式設計中常用的集合 對你非常有用

Java中的集合概述 集合是一個容器,用來存放引用型別的資料,在java.util包下。 Java中的集合主要有3種類型: List介面: 是一個有序集合,可以放重複的資料。 Set介面: 是一個無序集合,不允許放重複的資料。 Map介面: 是一個無序集合,集合

java中hashcode與equals集合中的用法)

一:Java中的equals方法和hashCode方法是Object中的,所以每個物件都是有這兩個方法的,有時候我們需要實現特定需求,可能要重寫這兩個方法 equals()和hashCode()方法是用來在同一類中做比較用的,尤其是在容器裡如set存放同一類物件

Java執行緒安全的集合

一、早期執行緒安全的集合 我們先從早期的執行緒安全的集合說起,它們是Vector和HashTable 1.Vector Vector和ArrayList類似,是長度可變的陣列,與ArrayList不同的是,Vector是執行緒安全的,它給幾乎所有的publ

Java集合--什麼是List

簡述 上章簡單介紹了什麼是集合,集合有哪幾種種類。 在這章中我們主要介紹Collection的其中一種實現方式,List。 什麼是List 在上一章,我們已經瞭解了List主要分為3類,ArrayList, LinkedList和Ve

Java 集合 一、Collection

  在Java開發中,我們有大量的儲存、訪問資料的需求,這時候就需要使用java中的集合類,一般來說,java中提供了list、set、map這些集合來供我們儲存、訪問資料。   java中集合類的繼承圖如下: 可見,list、set都實現了Collection介面,而