Java集合系列之Collection與Map介面巨集觀把控

我又不是架構師發表於2017-12-29

Java集合系列之Collection與Map介面巨集觀把控

Hello,大家好,元旦快到了,這裡提前祝大家元旦快樂,出行注意安全,回家的小夥伴能早日和家人見面,開開心心過元旦。Ok,切入主題,這篇文章,我本人覺得還是比較重要的,因為我準備在巨集觀上把Java集合這一塊給描述清楚。老套路,文章結構:

  1. Java集合類之間的繼承關係
  2. 各個巨集觀模組介紹
  3. 集合與集合之前的轉換,集合與陣列之間的轉換

1. Java集合類之間的繼承關係

Java的集合類主要由兩個介面派生而出:Collection和Map,Collection和Map是Java集合框架的根介面。來兩張圖:

Java集合系列之Collection與Map介面巨集觀把控
Java集合系列之Collection與Map介面巨集觀把控
圖中標紅圈的表示我們經常用的集合類。

2. 各個巨集觀模組介紹

2.1 Collection介面

Collection介面是Set,Queue,List的父介面。Collection介面中定義了多種方法可供其子類進行實現,以實現資料操作。

Java集合系列之Collection與Map介面巨集觀把控
可以看出Collection用法有:新增元素,刪除元素,返回Collection集合的個數以及清空集合等。 其中重點說下iterator()方法,該方法的返回值是Iterator。 這個迭代器是這樣來的

public interface Collection<E> extends Iterable<E> 
複製程式碼

使用樣例:

Collection<Day> days = new ArrayList<Day>();
Iterator<Day> iterator = days.iterator();
        while(iterator.hasNext()){//判斷是否有下一個元素
            Day next = iterator.next();//取出該元素
            //逐個遍歷,取得元素後進行後續操作
            .....
        }
複製程式碼

順便說一下,在遍歷Map集合的時候,雖然Map沒有繼承Iterable,不過沒有關係,可以轉換成set,然後再遍歷:

  • 第一種(據說是效率高於第二種,小弟也沒驗證過):
Map map = new HashMap();
    Iterator iter = map.entrySet().iterator();
    while (iter.hasNext()) {
        Map.Entry entry = (Map.Entry) iter.next();
        Object key = entry.getKey();
        Object val = entry.getValue();
    }
複製程式碼
  • 第二種:
Map map = new HashMap();
Iterator iter = map.keySet().iterator();
    while (iter.hasNext()) {
    Object key = iter.next();
    Object val = map.get(key);
}
複製程式碼

其次,需要注意的是,在使用Iterable遍歷Collection時,當Collection內部的元素為物件型別時,.next返回的是指標。也就是說是淺拷貝。

2.1.1 Set集合

Set集合類似於一個罐子,"丟進"Set集合裡的多個物件之間沒有明顯的順序。Set繼承自Collection介面,不能包含有重複元素(記住,這是整個Set類層次的共有屬性)。Set判斷兩個物件相同不是使用"=="運算子,而是根據equals方法。也就是說,我們在加入一個新元素的時候,如果這個新元素物件和Set中已有物件進行注意equals比較都返回false,則Set就會接受這個新元素物件,否則拒絕。 因為Set的這個制約,在使用Set集合的時候,應該注意兩點:

  • 為Set集合裡的元素的實現類實現一個有效的equals(Object)方法。
  • 對Set的建構函式,傳入的Collection引數不能包含重複的元素

API層面,Set集合與Collection集合基本相同,沒有提供任何額外的方法。實際上Set就是Collection,只是行為略有不同(Set不允許包含重複元素)。

2.1.2 List集合

List集合代表一個元素有序、可重複的集合,集合中每個元素都有其對應的順序索引。List集合允許加入重複元素,因為它可以通過索引來訪問指定位置的集合元素。List集合預設按元素的新增順序設定元素的索引.

API層面:List作為Collection介面的子介面,可以使用Collection介面裡的全部方法。而且由於List是有序集合,因此List集合裡增加了一些根據索引來操作集合元素的方法。如下:

  • void add(int index, Object element): 在列表的指定位置插入指定元素.
  • boolean addAll(int index, Collection<? extends E> c): 將集合c 中的所有元素都插入到列表中的指定位置index處。
  • Object get(index):返回列表中指定位置的元素。
  • int indexOf(Object o):返回此列表中第一次出現的指定元素的索引;如果此列表不包含該元素,則返回 -1。
  • int lastIndexOf(Object o):返回此列表中最後出現的指定元素的索引;如果列表不包含此元素,則返回 -1。
  • Object remove(int index): 移除列表中指定位置的元素。
  • Object set(int index, Object element):用指定元素替換列表中指定位置的元素。
  • List subList(int fromIndex, int toIndex):返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之間的所有集合元素組成的子集。
2.1.3 Queue集合

Queue用於模擬"佇列"這種資料結構(先進先出FIFO)。佇列的頭部儲存著佇列中存放時間最長的元素,佇列的尾部儲存著佇列中存放時間最短的元素。新元素插入(offer)到佇列的尾部,訪問元素(poll)操作會返回佇列頭部的元素,佇列不允許隨機訪問佇列中的元素。

Java集合系列之Collection與Map介面巨集觀把控

可以看到,新增了offer和poll用來描述佇列這種語義

2.2 Map介面

Map用於儲存具有"對映關係"的資料,因此Map集合裡儲存著兩組值,一組值用於儲存Map裡的key,另外一組值用於儲存Map裡的value。key和value都可以是任何引用型別的資料。Map的key不允許重複,即同一個Map物件的任何兩個key通過equals方法比較結果總是返回false。關於Map,我們要從程式碼複用的角度去理解,java是先實現了Map,然後通過包裝了一個所有value都為null的Map就實現了Set集合

  • Map的這些實現類和子介面中key集的儲存形式和Set集合完全相同(即key不能重複)
  • 與Set集合的關係:如果把Map裡的所有key放在一起看,它們就組成了一個Set集合(所有的key沒有順序,key與key之間不能重複),實際上Map確實包含了一個keySet()方法,用於返回Map裡所有key組成的Set集合。

API:

Java集合系列之Collection與Map介面巨集觀把控

Map集合最典型的用法就是成對地新增、刪除key-value對,然後就是判斷該Map中是否包含指定key,是否包含指定value,也可以通過Map提供的keySet()方法獲取所有key組成的集合,然後使用foreach迴圈來遍歷Map的所有key,根據key即可遍歷所有的value

3. 集合與集合之前的轉換,集合與陣列之間的轉換

3.1 集合與陣列之間的轉換

  • 陣列轉換成List:Array.asList()可以將一個陣列轉換成一個List.
  • 集合轉換成陣列:Collection介面中定義了toArray方法.

3.1 集合與集合之間的轉換

Map--》Collection: Map.keySet(),entrySet(),.values().三個API

List《---》Set《---》Queue:

        //Set--》List
        List<String> list3 = new ArrayList<String>(new HashSet<String>());   
        //List--》Set
        Set<String> set = new HashSet<String>(new ArrayList<String>());  
複製程式碼

說白了,都是通過構造方法來轉換的.

轉換這一塊給一個參考部落格:

結語

好了,巨集觀角度的Collection,Map算是給大家說清楚了,包括Collection下的子介面要實現的語義(子介面實現的特有方法)。然後集合之間的轉換等等,我覺得巨集觀上是比較重要的,也希望大家這一塊掌握好。Over,Hava a good day .元旦快樂,大家。

相關文章