天天看點

Java集合系列(一):集合的定義及分類 - 申城異鄉人

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

2019-07-26 17:06 

申城異鄉人 

閱讀(11683) 

評論(5) 

編輯 

收藏 

舉報

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等集合體系詳解(史上最全)

  • 分類 Java
  • 标簽 Java
Java集合系列(一):集合的定義及分類 - 申城異鄉人
上一篇: VIM總結VIM