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

1. 集合的定義

什麼是集合呢?html

定義:集合是一個存放對象的引用的容器。java

在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異常。微信

而使用集合時就不存在這個問題,由於集合在聲明時不須要指定長度而且長度會根據放入元素的多少而變化:dom

List<String> platformList = new ArrayList<>();
platformList.add("博客園");
platformList.add("掘金");
platformList.add("微信公衆號");
platformList.add("我的博客");

觀察上面聲明數組的代碼,咱們能夠推斷出下面的代碼確定是編譯不經過的:spa

String[] platformArray = new String[3];
platformArray[0] = "博客園";
platformArray[1] = "掘金";
platformArray[2] = 1;

由於數組聲明時用的是String類型,而platformArray[2] = 1;賦值時卻使用了int類型。.net

再來看下下面的集合代碼:3d

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

這段代碼也是編譯不經過的,在IDEA中,鼠標懸停時會提示以下的錯誤信息:

意思是類型參數不能是原始類型(基本數據類型),那怎麼使用呢?總不能不讓我使用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集合

它們之間的繼承關係能夠參考下圖。

從上圖能夠總結出以下幾點:

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

原創不易,若是以爲文章能學到東西的話,歡迎點個贊、評個論、關個注,這是我堅持寫做的最大動力。

若是有興趣,歡迎添加個人微信:zwwhnly,等你來聊技術、職場、工做等話題(PS:我是一名奮鬥在上海的程序員)。

原文出處:https://www.cnblogs.com/zwwhnly/p/11251562.html

相關文章
相關標籤/搜索