1. 集合的定義
什么是集合呢?
定義:集合是一個存放對象的引用的容器。
在Java中,集合位於java.util包下。
2. 集合和數組的區別(面試常問)
提到容器,就會想起數組,那么集合和數組的區別是什么呢?(這里是重點,面試可能問的比較多)
- 數組和集合都是Java中的容器
- 數組的長度是固定的,集合的長度是可變的
- 數組只能存儲相同數據類型的數據,這里的數據類型可以是基本數據類型,也可以是引用類型
- 集合可以存儲不同數據類型的對象的引用(但一般情況下,我們會使用泛型來約定只使用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中,鼠標懸停時會提示如下的錯誤信息:
意思是類型參數不能是原始類型(基本數據類型),那怎么使用呢?總不能不讓我使用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種:
- List集合
- Set集合
- Map集合
它們之間的繼承關系可以參考下圖。
從上圖可以總結出如下幾點:
- Java集合的根接口是Collection,它又繼承了迭代接口Iterable
- List接口和Set接口繼承了Collection接口
- Map接口是獨立的接口,並沒有繼承Collection接口 (這里是重點,面試可能問的比較多)
- List接口常用的實現類有:ArrayList、LinkedList、Vector
- Set接口常用的實現類有:HashSet、LinkedHashSet、TreeSet
- Map接口常用的實現類有:HashMap、HashTable、TreeMap
4. List集合
List集合包括List接口以及List接口的所有實現類。List集合具有以下特點:
- 集合中的元素允許重復
- 集合中的元素是有順序的,各元素插入的順序就是各元素的順序
- 集合中的元素可以通過索引來訪問或者設置
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個)
- 集合中的元素不一定保證有序
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集合具有以下特點:
- Map接口並沒有繼承Collection接口,提供的是key到value的映射
- 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的區別(這里是重點,面試可能問的比較多),后續會單獨寫文總結,敬請期待。