Carson帶你學Java:那些關于集合的內(nèi)容都匯總在這里了!


前言

  • Java中,集合的使用可謂是重中之重
  • 本文將獻上一份 全面 & 詳細的Java集合學習攻略,希望您們會喜歡。

目錄

示意圖

1. 簡介

示意圖

2. 與數(shù)組的區(qū)別

Java集合 與 常用數(shù)組的區(qū)別如下:

示意圖

3. 集合類型

  • Java集合的類型可分為Set、List、MapQueue 4種

  • 具體介紹如下

示意圖

下面會更加詳細地說明


4. 集合繼承關系

  • Java集合的根接口 = Collection接口 + Map接口

Java的集合類都實現(xiàn)上述2個接口

其中:

  • ListSetQueue實現(xiàn)了 Collection接口。繼承關系如下:
示意圖
  • Map 實現(xiàn)了 Map接口 。繼承關系如下:
示意圖

下面,我將主要介紹 Collection接口 、Map接口 & 其具體集合實現(xiàn)類


5. Collection相關

在本節(jié)中,會先介紹Collection接口,再介紹其具體集合實現(xiàn)類(ListSet、Queue類)

5.1 Collection 接口

  • 定義
    一個接口,是集合List、Set、Queue容器的頂層父接口

  • 包結構

示意圖
  • 接口中定義的方法
    主要用于 添加元素、刪除元素 等等
Boolean add(Object o); // 向集合中添加一個對象的引用

Boolean remove(Object o); // 從集合中刪除一個對象的引用
Void clear();// 刪除集合中的所有對象,即不再持有這些對象的引用

Boolean contains(Object o);// 判斷在集合中是否持有特定對象
Object[] toArray();// 返回1個數(shù)組,該數(shù)組包含集合中的所有元素

Iterator iterator(); // 返回1個Iterator對象:用于遍歷集合中的元素

Boolean isEmpty();// 判斷集合是否為空
Int size();// 返回集合中元素的數(shù)目

Boolean equals(Object o); // 對象比較
Int hashCode() ;// 返回hash碼 
  • Collections的區(qū)別
示意圖

附:Collections的使用

// 主要功能有:搜索元素、獲取最大最小值、排序集合、對象線程安全化、將1個List所有元素復制到另1個 等
// 1. 獲取最大最小值
static T max(Collection<? extends T> coll, Comparator<? super T> comp); 
static T min(Collection<? extends T> coll, Comparator<? super T> comp); 

// 2. 排序 
static void sort(List<T> list, Comparator<? super T> c); 

// 3. 將線程不安全的Collection轉(zhuǎn)為線程安全的Collection 
static Collection<T> synchronizedCollection(Collection<T> c); 
static List<T> synchronizedList(List<T> list); 
static Map<K,V> synchronizedMap(Map<K,V> m); 
static Set<T> synchronizedSet(Set<T> s);

// 交換指定位置的兩個元素 
static void swap(List<?> list, int i, int j) 

// 主要操作對象 = 集合類 = `Collection`接口的實現(xiàn)類
List list = new ArrayList(); 
list.add(XXX); 
//··· 
list.add(XXX); 
Collectoions.sort(list);
  • CollectionsArrays 的區(qū)別
示意圖

下面,我將介紹其具體集合實現(xiàn)類:ListSet、Queue

5.2 List 集合

  • 簡介
示意圖
  • 使用方法
void add(int index, Object element); // 將元素elment插入在集合list的index處
boolean addAll(Collection<? extends E> c);  // 將集合c 中的所有元素都插入到列表中的指定位置index處

E set(int index, E element); // 將集合中index索引處的元素替換成element

Object get(int index); // 返回List集合index索引處的元素
Int indexOf(Object o) ;// 返回集合中元素o的index索引
int lastIndexOf(Object o); // 返回集合中最后一個元素的索引
List subList(int fromIndex,int toIndex);// 返回集合中從索引fromIndex到toIndex索引處的元素集合

Object remove(int index);// 刪除集合index索引處的元素

void clear();  // 清空集合
int size();  // 獲得集合長度
boolean isEmpty(); // 判斷集合是否為空
  • 集合實現(xiàn)類
    List的集合實現(xiàn)類主要包括:Vector、ArrayList、LinkedList、Stack。具體介紹如下
示意圖
  • VectorArrayList、LinkedList之間的區(qū)別
示意圖

5.3 Set 集合

  • 簡介
示意圖
  • 使用方法
boolean add(E e);  // 添加元素
boolean remove(Object o);  // 刪除元素

boolean addAll(Collection<? extends E> c); // 插入集合c 中的所有元素到集合中
boolean removeAll(Collection<?> c);  // 移除原集合中的集合c中的元素

boolean contains(Object o);  // 判斷是否包含該元素
boolean containsAll(Collection<?> c);  // 判斷是否包含該集合中的元素

Object[] toArray();  // 返回1個數(shù)組,該數(shù)組包含集合中的所有元素

void clear();  // 清空集合
int size();  // 獲得集合長度
boolean isEmpty(); // 判斷集合是否為空
  • 集合實現(xiàn)類
    Set的集合實現(xiàn)類主要包括:TreeSet、HashSetLinkedHashSet)、EnumSet。具體介紹如下
示意圖

5.4 Queue 集合

  • 簡介
示意圖
  • 使用方法
//插入新元素到隊列:插入成功則返回true; 若隊列已滿,拋出IllegalStateException異常 
boolean add(E e); 
 
//插入新元素到隊列,若插入成功則返回true ;若隊列已滿,返回false,但不拋出異常 
boolean offer(E e); 
 
E remove();  // 返回第1個元素 & 從隊列中刪除;若隊列為空,拋出異常 
E poll();  // 返回第1個元素 & 從隊列中刪除 ;若隊列為空,返回null,但不拋出異常 
E element();  //返回的第1個元素 & 不從隊列中刪除;若隊列為空,則拋異常 
E peek(); // 返回第1元素 & 不從隊列中刪除;若隊列為空,則返回null

// 時間復雜度分析
// 1. 插入方法:offer()、poll()、remove() 、add ()= O(log(n)) 
// 2. 刪除方法:remove() 、 contains()  = O(n) 
// 3. 檢索方法:peek()、element() 、size() = O(1)


// 使用建議
// 1. 遍歷時,若使用但不需刪除元素,使用element()、peek()(時間效率高)
// 2. 使用offer()加入元素、poll()取出元素
    // a. 避免使用Collection的add() 、remove()
    // b. 原因 = 通過返回值可判斷成功與否,但add()、remove()在失敗時會拋出異常

  • 集合實現(xiàn)類
    Queue的集合實現(xiàn)類主要包括:PriorityQueue、DueueArrayDequeLinkedList)、PriorityQueueArrayBlockingQueue、LinkedBlockingQueue)。具體介紹如下
示意圖

至此,關于Collection接口、其具體集合實現(xiàn)類(List、Set、Queue類)講解完畢??偨Y如下

示意圖

6. Map 相關

在本節(jié)中,會先介紹Map接口,再介紹其具體集合實現(xiàn)類中最常見的HashMap、LinkedHashMapTreeMap

6.1 Map 接口

  • 簡介
示意圖

注:Map接口 與 Collection 接口無關

  • 包結構
示意圖
// 為了更好理解各類的關系,下面附上:各類的定義圖
// HashMap 
public class HashMap<K,V> 
    extends AbstractMap<K,V> 
    implements Map<K,V>, Cloneable, Serializable{} 
 
// LinkedHashMap 
public class LinkedHashMap<K,V> 
    extends HashMap<K,V> 
    implements Map<K,V>{}

// TreeMap 
public class TreeMap<K,V> 
    extends AbstractMap<K,V> 
    implements NavigableMap<K,V>, Cloneable, java.io.Serializable{} 

// Hashtable 
public class Hashtable<K,V> 
    extends Dictionary<K,V> 
    implements Map<K,V>, Cloneable, java.io.Serializable {} 

// ConcurrentHashMap 
public class ConcurrentHashMap<K, V> extends AbstractMap<K, V> 
        implements ConcurrentMap<K, V>, Serializable {} 
  • 接口中定義的方法
Set<K> keySet();  // 單獨抽取key序列,將所有key生成一個Set
Collection<V> values();  // 單獨value序列,將所有value生成一個Collection
 
V remove(Object key);  // 刪除該映射關系
V get(Object key); // 獲得指定鍵的值
V put(K key, V value);  // 添加鍵值關系
void putAll(Map<? extends K, ? extends V> m);  // 將指定Map中的映射關系 復制到 此Map中

boolean containsKey(Object key); // 若存在該鍵的映射關系,則返回true
boolean containsValue(Object value);  // 若存在該值的映射關系,則返回true
 
void clear(); // 清除所有映射關系
int size();  // 返回鍵值關系的數(shù)量
boolean isEmpty(); // 若未包含鍵值關系,則返回true


// Map中還包括1個內(nèi)部類:Entry
// 該類封裝了一個key-value對
// Entry類包含如下方法:
boolean equals(Object o );// 比較指定對象 與 此項 的相等性

K getKey();// 返回 與 此項 對應的鍵
V getValue();// 返回 與 此項 對應的值

int hashCode();// 返回此映射項的哈希值
V setValue(V value) ;// 使用指定值替換 與 此項對應的值
  • Set集合、List集合的關系
示意圖

下面,我將介紹其具體集合實現(xiàn)類中最常見的HashMap、LinkedHashMap、TreeMap

6.2 HashMap

  • 類定義
public class HashMap<K,V>
         extends AbstractMap<K,V> 
         implements Map<K,V>, Cloneable, Serializable
  • 主要介紹
示意圖

關于其更加具體介紹 & 源碼分析,請看文章:

注:HashMap 的實現(xiàn)在 JDK 1.7JDK 1.8 差別較大,建議一同查看

6.3 LinkedHashMap

  • 類定義
public class LinkedHashMap<K,V> 
    extends HashMap<K,V> 
    implements Map<K,V>{}
  • 簡介
示意圖
  • 具體介紹

關于更多LinkedHashMap的具體介紹 & 源碼分析,請看文章

6.4 TreeMap

  • 類定義
public class TreeMap<K,V> 
    extends AbstractMap<K,V> 
    implements NavigableMap<K,V>, Cloneable, java.io.Serializable{} 
  • 簡介
示意圖
  • 關于排序方式 & 判斷相等的標準
示意圖

6.5 相關子類比較

  • HashMap 、LinkedHashMap、TreeMap的區(qū)別

    示意圖

  • HashMapHashtable 的區(qū)別

示意圖
  • HashMap 、 ConcurrentHashMap 的區(qū)別
示意圖

至此,關于Java集合的相關內(nèi)容(Colletcion 、Map接口 & 其相關實現(xiàn)子類)講解完畢。


7. 總結

本文主要講解了Java集合的相關內(nèi)容,包括Colletcion 接口、Map接口 & 其相關實現(xiàn)子類),具體總結如下:

示意圖

Carson帶你學Android系列文章
Carson帶你學Android:學習方法
Carson帶你學Android:四大組件
Carson帶你學Android:自定義View
Carson帶你學Android:異步-多線程
Carson帶你學Android:性能優(yōu)化
Carson帶你學Android:動畫


歡迎關注Carson_Ho的簡書!

分享Android技術干貨,追求短、平、快,但卻不缺深度


請點贊!因為你的鼓勵是我寫作的最大動力!

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容