Java集合總結—再也不怕面試問到集合了
Java集合總結
1、常見的集合
Map介面和Collection介面是所有集合框架的父介面:
Collection介面的子介面包括:Set介面和List介面
Map介面的實現類主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等
Set介面的實現類主要有:HashSet、TreeSet、LinkedHashSet等
List介面的實現類主要有:ArrayList、LinkedList、Stack以及Vector等
2、集合特點
List介面實現類:
ArrayList:排列有序、可重複;底層使用陣列;查詢快、增刪慢;執行緒不安全;容量不夠時,擴容是當前容量1.5倍+1
Vector:排列有序、可重複;底層使用陣列;查詢快、增刪慢;執行緒安全、效率低;容量不夠時,擴容是當前的1倍
LinkedList:排列有序;底層使用雙向連結串列;查詢慢、增刪快;執行緒不安全
Set介面實現類:
HashSet:排列無序(儲存在其中的資料進行自動的排序,不是新增的順序)、不可重複;底層使用雜湊表表實現;存取速度快;內部是HashMap;預設初始容量為16;容量不夠時,擴容是當前的1倍;集合元素可以是null,但只能放入一個null。
TreeSet:排列無序(儲存在其中的資料進行自動的排序,不是新增的順序)、不可重複;底層使用二叉樹實現;排列儲存;內部是TreeMap和SortedSet
LinkedHashSet:採用雜湊表儲存,並用雙向連結串列記錄插入順序;內部是LinkHashMap
示例對HashSet、TreeSet、LinkedHashSet是否有序做出解釋:
1 public class SetTest { 2 3 public static void main(String[] args){ 4 5 Set<Integer> hashSet = new HashSet<Integer>(); 6 hashSet.add(6); 7 hashSet.add(10); 8 hashSet.add(9); 9 hashSet.add(8); 10 hashSet.add(45); 11 System.out.println("----------hashSet----------"); 12 System.out.println("儲存在其中的資料進行自動的排序,不是新增的順序"); 13 for (Integer s : hashSet){ 14 System.out.println(s); 15 } 16 17 Set<Integer> treeSet = new TreeSet<Integer>(); 18 treeSet.add(6); 19 treeSet.add(10); 20 treeSet.add(9); 21 treeSet.add(8); 22 treeSet.add(45); 23 System.out.println("----------treeSet----------"); 24 System.out.println("儲存在其中的資料進行自動的排序,不是新增的順序"); 25 for (Integer s : treeSet){ 26 System.out.println(s); 27 } 28 29 Set<Integer> linkedHashSet = new LinkedHashSet<>(); 30 linkedHashSet.add(6); 31 linkedHashSet.add(10); 32 linkedHashSet.add(9); 33 linkedHashSet.add(8); 34 linkedHashSet.add(45); 35 System.out.println("----------linkedHashSet----------"); 36 System.out.println("是新增的順序"); 37 for (Integer s : linkedHashSet){ 38 System.out.println(s); 39 } 40 41 } 42 }
結果:
1 ----------hashSet---------- 2 儲存在其中的資料進行自動的排序,不是新增的順序 3 6 4 8 5 9 6 10 7 45 8 ----------treeSet---------- 9 儲存在其中的資料進行自動的排序,不是新增的順序 10 6 11 8 12 9 13 10 14 45 15 ----------linkedHashSet---------- 16 是新增的順序 17 6 18 10 19 9 20 8 21 45
Map介面實現類:
HashMap:鍵不可重複,值可重複;底層雜湊表表;執行緒不安全;key、value都可為null;預設初始容量為16;容量不夠時,擴容是當前的1倍
HashTable:鍵不可重複,值可重複;底層雜湊表表;執行緒安全;key、value都不可為null;預設初始容量為11;容量不夠時,擴容為2*原陣列長度+1,如 HashTable的容量為11,一次擴容後是容量為23
TreeMap:鍵不可重複,值可重複;底層使用二叉樹
2、ArrayList、Vector、LinkedList對比
型別/屬性 |
ArrayList |
Vector |
LinkedList |
是否有序 | 排列有序、可重複 | 排列有序、可重複 | 排列有序 |
底層 | 底層使用陣列 | 底層使用陣列 | 底層使用雙向連結串列 |
操作 | 查詢快、增刪慢 | 查詢快、增刪慢 | 查詢慢、增刪快 |
執行緒是否安全 | 執行緒不安全 | 執行緒安全、效率低 | 執行緒不安全 |
預設初始容量 | 10 | 10 | |
擴容 | 容量不夠時,擴容是(原始大小/2 + 1) | 容量不夠時,擴容是當前的1倍 |
LinkedList是一個雙向連結串列,沒有初始化大小,也沒有擴容的機制,就是一直在前面或者後面新增就好。
HashSet、TreeSet、LinkedHashSet對比:
型別/屬性 | HashSet | TreeSet | LinkedHashSet |
是否有序 | 排列無序、不可重複 | 排列無序、不可重複 | 有序 |
底層 | 底層使用雜湊表表 | 底層使用二叉樹 | 採用雜湊表儲存、雙向連結串列記錄插入順序 |
儲存 | 存取速度快 | 排列儲存 | |
內部 | 內部是HashMap | 內部是TreeMap和SortedSet | 內部是LinkHashMap |
預設初始容量 | 16 | ||
擴容 | 原容量的 1 倍 |
LinkedHashSet底層資料結構是雜湊表和連結串列 連結串列保證元素有序 雜湊表保證元素唯一。
HashMap、HashTable、TreeMap對比:
型別/屬性 | HashMap | HashTable | TreeMap |
鍵值 | 鍵不可重複,值可重複 | 鍵不可重複,值可重複 | 鍵不可重複,值可重複 |
底層 | 底層Hash表 | 底層Hash表 | 底層使用二叉樹 |
執行緒是否安全 | 執行緒不安全 | 執行緒安全 | |
K/V | key、value都可為null | key、value都不可為null | |
預設初始容量 | 16 | 11 | |
擴容 | 1倍 | 原陣列長度+1 |