Java集合系列(一):集合的定義及分類

申城異鄉人發表於2019-07-26

1. 集合的定義

什麼是集合呢?

定義:集合是一個存放物件的引用的容器。

在Java中,集合位於java.util包下。

2. 集合和陣列的區別(面試常問)

提到容器,就會想起陣列,那麼集合和陣列的區別是什麼呢?(這裡是重點,面試可能問的比較多)

  1. 陣列和集合都是Java中的容器
  2. 陣列的長度是固定的,集合的長度是可變的
  3. 陣列只能儲存相同資料型別的資料,這裡的資料型別可以是基本資料型別,也可以是引用型別
  4. 集合可以儲存不同資料型別的物件的引用(但一般情況下,我們會使用泛型來約定只使用1種資料型別),但不能儲存基本資料型別

空口無憑,我們來點程式碼配合理解,首先,我們看下如下的陣列程式碼:

String[] platformArray = new String[3];
platformArray[0] = "部落格園";
platformArray[1] = "掘金";
platformArray[2] = "微信公眾號";
platformArray[3] = "個人部落格";

執行程式碼就會發現,platformArray[3] = "個人部落格";會引發java.lang.ArrayIndexOutOfBoundsException異常。

而使用集合時就不存在這個問題,因為集合在宣告時不需要指定長度並且長度會根據放入元素的多少而變化:

List<String> platformList = new ArrayList<>();
platformList.add("部落格園");
platformList.add("掘金");
platformList.add("微信公眾號");
platformList.add("個人部落格");

觀察上面宣告陣列的程式碼,我們可以推斷出下面的程式碼肯定是編譯不通過的:

String[] platformArray = new String[3];
platformArray[0] = "部落格園";
platformArray[1] = "掘金";
platformArray[2] = 1;

因為陣列宣告時用的是String型別,而platformArray[2] = 1;賦值時卻使用了int型別。

再來看下下面的集合程式碼:

List<int> intList = new ArrayList<int>();
intList.add(1);
intList.add(2);
intList.add(3);

這段程式碼也是編譯不通過的,在IDEA中,滑鼠懸停時會提示如下的錯誤資訊:

Java集合系列(一):集合的定義及分類

意思是型別引數不能是原始型別(基本資料型別),那怎麼使用呢?總不能不讓我使用int型的集合吧?

當然不會,Java為每種基本資料型別都提供了對應的包裝類,這裡修改為int型別對應的包裝類Integer即可:

List<Integer> intList = new ArrayList<Integer>();
intList.add(1);
intList.add(2);
intList.add(3);

以下為Java的原始型別(基本資料型別)與其對應的包裝類:

原始型別(基本資料型別) 包裝類
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

3. 集合的分類

在Java中,集合主要分為以下3種:

  1. List集合
  2. Set集合
  3. Map集合

它們之間的繼承關係可以參考下圖。

Java集合系列(一):集合的定義及分類

從上圖可以總結出如下幾點:

  1. Java集合的根介面是Collection,它又繼承了迭代介面Iterable
  2. List介面和Set介面繼承了Collection介面
  3. Map介面是獨立的介面,並沒有繼承Collection介面 (這裡是重點,面試可能問的比較多)
  4. List介面常用的實現類有:ArrayList、LinkedList、Vector
  5. Set介面常用的實現類有:HashSet、LinkedHashSet、TreeSet
  6. Map介面常用的實現類有:HashMap、HashTable、TreeMap

4. List集合

List集合包括List介面以及List介面的所有實現類。List集合具有以下特點:

  1. 集合中的元素允許重複
  2. 集合中的元素是有順序的,各元素插入的順序就是各元素的順序
  3. 集合中的元素可以通過索引來訪問或者設定

List介面常用的實現類有:ArrayList、LinkedList、Vector。

我們先看下如下示例瞭解下List集合的用法:

package collection;

import java.util.*;

public class Muster {
    public static void main(String[] args) {
        List<String> strList = new ArrayList<>();
        strList.add("a");
        strList.add("b");
        strList.add("c");

        int i = (int) (Math.random() * strList.size());
        System.out.println("隨機獲取陣列中的元素:" + strList.get(i));

        strList.remove(2);

        System.out.println("將索引為2的元素從列表移除後,陣列中的元素是:");
        for (int j = 0; j < strList.size(); j++) {
            System.out.println(strList.get(j));
        }
    }
}

以上程式碼的輸出結果為:

隨機獲取陣列中的元素:a

將索引為2的元素從列表移除後,陣列中的元素是:

a

b

關於List集合的詳細用法,ArrayList、LinkedList、Vector的區別(這裡是重點,面試可能問的比較多),後續會單獨寫文總結,敬請期待。

5. Set集合

Set集合包括Set介面以及Set介面的所有實現類。Set集合具有以下特點:

  1. 集合中不包含重複元素(你可以重複新增,但只會保留第1個)
  2. 集合中的元素不一定保證有序

Set介面常用的實現類有:HashSet、LinkedHashSet、TreeSet。

我們先看下如下示例瞭解下Set集合的用法:

package collection;

import java.util.*;

public class Muster {
    public static void main(String[] args) {
        Set<String> platformList = new HashSet<>();
        platformList.add("部落格園");
        platformList.add("掘金");
        platformList.add("微信公眾號");
        platformList.add("個人部落格");

        // 嘗試新增重複元素
        platformList.add("部落格園");
        platformList.add("掘金");

        for (String platform : platformList) {
            System.out.println(platform);
        }
    }
}

以上程式碼的輸出結果為:

部落格園

個人部落格

掘金

微信公眾號

可以看出,雖然我們嘗試新增了重複元素,但並沒有新增成功並且輸出的元素沒有順序。

因此當你的集合中不允許有重複元素並且對排序也沒有要求的話,可以使用Set集合。

關於Set集合的詳細用法,HashSet、LinkedHashSet、TreeSet的區別(這裡是重點,面試可能問的比較多),後續會單獨寫文總結,敬請期待。

6. Map集合

Map集合包括Map介面以及Map介面的所有實現類。Map集合具有以下特點:

  1. Map介面並沒有繼承Collection介面,提供的是key到value的對映
  2. Map中不能包含相同的key

Map介面常用的實現類有:HashMap、HashTable、TreeMap。

我們先看下如下示例瞭解下Map集合的用法:

package collection;

import java.util.*;

public class Muster {
    public static void main(String[] args) {
        Map<Integer, String> platformMap = new HashMap<>();
        platformMap.put(1, "部落格園");
        platformMap.put(2, "掘金");
        platformMap.put(3, "微信公眾號");
        platformMap.put(4, "個人部落格");

        // 嘗試新增重複Map
        platformMap.put(4, "個人部落格");

        // 獲取所有的key
        Set<Integer> keys = platformMap.keySet();
        for (Integer integer : keys) {
            System.out.println("Key:" + integer + ",Value:" + platformMap.get(integer));
        }
    }
}

以上程式碼的輸出結果為:

Key:1,Value:部落格園

Key:2,Value:掘金

Key:3,Value:微信公眾號

Key:4,Value:個人部落格

從日誌可以看出,當我們嘗試重加重複Map時,並沒有新增成功。

關於Map集合的詳細用法,HashMap、HashTable、TreeMap的區別(這裡是重點,面試可能問的比較多),後續會單獨寫文總結,敬請期待。

7. 原始碼及參考

Java集合中List,Set以及Map等集合體系詳解(史上最全)

8. 最後

打個小廣告,歡迎掃碼關注微信公眾號:「申城異鄉人」,定期分享Java技術乾貨,讓我們一起進步。

Java集合系列(一):集合的定義及分類

相關文章