集合框架

for英傑發表於2020-12-03

集合框架

利用閒暇的時間,針對性的 牢固下java基礎

1.1.java集合框架包含的內容

  • **介面:**是代表集合的抽象資料型別。例如 Collection、List、Set、Map 等。之所以定義多個介面,是為了以不同的方式操作集合物件
  • **實現(類):**是集合介面的具體實現。從本質上講,它們是可重複使用的資料結構,例如:ArrayList、LinkedList、HashSet、HashMap。
  • **演算法:**是實現集合介面的物件裡的方法執行的一些有用的計算,例如:搜尋和排序。這些演算法被稱為多型,那是因為相同的方法可以在相似的介面上有著不同的實現。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-fVpEAzHN-1606930346870)(C:\Users\Administrator.USER-20190927LX\AppData\Roaming\Typora\typora-user-images\image-20201201020729336.png)]

問題:Collection與Collections的區別?

1.Collection:

是集合類的上層介面。本身是一個Interface,裡面包含了一些集合的基本操作。

Collection介面是List介面和Set介面的父介面

2.Collections

Collections是一個集合框架的幫助類,提供了對集合進行排序,遍歷等多種演算法實現.

最根本的是Collections是一個類,就像一個工具類,服務於Java的Collection框架。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-NRPkuThO-1606930346876)(C:\Users\Administrator.USER-20190927LX\AppData\Roaming\Typora\typora-user-images\image-20201202214207633.png)]

一.List 介面 List介面是一個有序的 Collection,使用此介面能夠精確的控制每個元素插入的位置,能夠通過索引(元素在List中位置,類似於陣列的下標)來訪問List中的元素,第一個元素的索引為 0,而且允許有相同的元素。List 介面儲存一組不唯一,有序(插入順序)的物件。

二.Set 具有與 Collection 完全一樣的介面,只是行為上不同,Set 不儲存重複的元素。

Set 介面儲存一組唯一,無序的物件。

三.Map

Map 介面儲存一組鍵值物件,提供key(鍵)到value(值)的對映。

問題:list和Set的區別是是什麼呢?

    1. Set 介面例項儲存的是無序的,不重複的資料。List 介面例項儲存的是有序的,可以重複的元素。
    1. Set檢索效率低下,刪除和插入效率高,插入和刪除不會引起元素位置改變 <實現類有HashSet,TreeSet>
    1. List和陣列類似,可以動態增長,根據實際儲存的資料的長度自動增長List的長度。查詢元素效率高,插入刪除效率低,因為會引起其他元素位置改變 <實現類有ArrayList,LinkedList,Vector>

1.2 List 介面的實現類

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-NBuRg4hu-1606930346884)(C:\Users\Administrator.USER-20190927LX\AppData\Roaming\Typora\typora-user-images\image-20201201024117039.png)]

一.ArrayList

該類也是實現了List的介面,實現了可變大小的陣列,隨機訪問和遍歷元素時,提供更好的效能。該類也是非同步的,在多執行緒的情況下不要使用。ArrayList 增長當前長度的50%,插入刪除效率低。

二.LinkedList

該類實現了List介面,允許有null(空)元素。主要用於建立連結串列資料結構,該類沒有同步方法,如果多個執行緒同時訪問一個List,則必須自己實現訪問同步,解決方法就是在建立List時候構造一個同步的List。例如:

List list=Collections.synchronizedList(newLinkedList(...));

LinkedList 查詢效率低。

1.3ArrayList 集合類

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-qqgbYF1W-1606930346895)(C:\Users\Administrator.USER-20190927LX\AppData\Roaming\Typora\typora-user-images\image-20201202234847847.png)]

public static void main(String[] args) {
    //1.建立集合物件
    List<String> list=new ArrayList();

    //2.新增元素
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");


    //3.在指定的索引位置 新增元素
    list.add(1,"A");
    list.add(1,"看我在哪裡?"); //A上面  更新索引


    //4.返回列表中的元素個數
    System.out.println("總共有:"+list.size()+"條資料");
    //5.返回指定索引位置處的元素,取出的元素是Object型別 使用前需要進行強制轉換  (在定義集合的時候,我使用了泛型)
    String str=list.get(0);
    System.out.println("下標標為0的資料是:"+str);

    //6.從列表中刪除元素
    //list.remove("A");   或者按下標指引刪除

    //7 .判斷列表中是否存在元素  a
    if (list.contains("A")==true){
        System.out.println("該資料存在");
    }

    //8.迴圈遍歷
    for (String s:list){
        System.out.println(s);
    }
}

檢視執行結果
在這裡插入圖片描述

1.4LinkedList的特殊方法 (比上面的ArrayList基礎上新增加的方法)

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-I99qKhvC-1606930346900)(C:\Users\Administrator.USER-20190927LX\AppData\Roaming\Typora\typora-user-images\image-20201203002811008.png)]

2.1 Map 介面

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-h79Tcbx1-1606930346902)(C:\Users\Administrator.USER-20190927LX\AppData\Roaming\Typora\typora-user-images\image-20201203004006666.png)]

public static void main(String[] args) {
    /**
     * map 鍵(key) 不能重複,必須代表唯一   值(value)可以重複
     */
    Map <String,String> maps =new HashMap();

    //1.以 鍵值對的方式進行儲存
    maps.put("dg","島國");
    maps.put("dg","東莞"); //此時下面的值  會覆蓋了上面的value=島國
    maps.put("zg","中國");

    //2.根據鍵 返回相關聯的值
    String dg=maps.get("dg");
    System.out.println(dg);  //東莞

    //3.返回元素個數
    System.out.println("總共有:"+maps.size()+"條資料");  //2條

    //4.返回鍵的集合 , 可以看到返回的是 Set集合
    Set <String> keys=maps.keySet();
    System.out.println(keys);  // [dg, zg]

    //5.返回值的集合
    System.out.println(maps.values());  //[東莞, 中國]
    // 迴圈遍歷
    for (String str:keys){
        System.out.println(maps.get(str));
    }

    //6.判斷是否含有指定的鍵 對映的 鍵-值對 如果存在返回true
    boolean flag=maps.containsKey("zz");
    System.out.println(flag);  //false
    //刪除指定的鍵
    //maps.remove("dg");
}

一.通過Map集合儲存 一個物件例項 並且迴圈遍歷

public static void main(String[] args) {
    //1.建立dog物件

    Dog dog1 = new Dog("小白1","品種1");
    Dog dog2 = new Dog("小白2","品種2");
    Dog dog3 = new Dog("小白3","品種3");
    Dog dog4 = new Dog("小白4","品種4");
    //2.建立HashMap  <key資料型別通常是字串,值資料型別>
    Map maps = new HashMap();

    //3.把dog物件存入 HashMap集合 中

    maps.put("dog1",dog1);
    maps.put("dog2",dog2);
    maps.put("dog3",dog3);
    maps.put("dog4",dog4);

    //4獲取所有的key
    System.out.println(maps.keySet());
    //上面沒有使用泛型,我取到了值,可以使用泛型的
    Set<String> keys=maps.keySet();

    //5.迴圈輸出map中的所有值
    //迴圈Set集合中的中值
    for(Object key:  keys){
        //通過key得到value
        Dog dog=(Dog) maps.get(key);
        System.out.println(dog);

    }
}

結果

[dog4, dog3, dog2, dog1]
Dog{name=‘小白4’, strain=‘品種4’}
Dog{name=‘小白3’, strain=‘品種3’}
Dog{name=‘小白2’, strain=‘品種2’}
Dog{name=‘小白1’, strain=‘品種1’}

二.通過迭代器來迴圈遍歷

public static void main(String[] args) {
    //1.建立dog物件

    Dog dog1 = new Dog("小白1","品種1");
    Dog dog2 = new Dog("小白2","品種2");
    Dog dog3 = new Dog("小白3","品種3");
    Dog dog4 = new Dog("小白4","品種4");
    //2.建立HashMap  <key資料型別通常是字串,值資料型別>
    Map maps = new HashMap();

    //3.把dog物件存入 HashMap集合 中
    maps.put("dog1",dog1);
    maps.put("dog2",dog2);
    maps.put("dog3",dog3);
    maps.put("dog4",dog4);

    //通過key去刪除值
    //maps.remove("dog1");

    //4獲取所有的key
    Set<String> keys=maps.keySet();

    //迭代器
    Iterator  it = keys.iterator();
    //it.hasNext()//返回的是boolean 如果有值,則返回true
    System.out.println(it.hasNext());
    while (it.hasNext()){//如果為 true才會進迴圈
        System.out.println(it.next());
    }
}

結果為:

true
dog4
dog3
dog2
dog1

補充 :集合中為什麼要開放迭代器功能

首先使用迭代器適用性強,因為如果用for迴圈遍歷,需要事先知道集合的資料結構,而且當換了一種集合的話程式碼不可重用要修改,不符合開閉原則。而Iterator是用同一種邏輯來遍歷集合。其次使用Iterator可以在不瞭解集合內部資料結構的情況下直接遍歷,這樣可以使得集合內部的的資料不暴露。
for迴圈的遍歷
ArrayList list = new ArrayList<>();
for(int i = 0; i < list.size(); i++){
   System.out.println(list.get(i));
}

迭代器遍歷
Iterator it =list.iterator();
while(it.hasNext()){
   System.out.println(it.next());
}

總結

Java集合框架為程式設計師提供了預先包裝的資料結構和演算法來操縱他們。

集合是一個物件,可容納其他物件的引用。集合介面宣告對每一種型別的集合可以執行的操作。

集合框架的類和介面均在java.util包中。

任何物件加入集合類後,自動轉變為Object型別,所以在取出的時候,需要進行強制型別轉換。

相關文章