Java集合系列——總序

Java集合系列目錄:

  1. Java集合系列——總序
  2. Java集合系列——ArrayList源碼詳解

一、概要

Java集合是Java語言最基礎也很重要的一部分知識,很多公司的面試官面試Java開發的時候都會專門考察Java集合方面的知識。網上已經有很多Java集合系列的文章,這裏我也對Java集合大家族各個主要成員做個詳細系統的介紹。本篇是總序,介紹集合大家族的主要成員,後面會介紹一些具體的集合實現類。

二、Java集合大家庭

Java集合類存放在java.util包中,工具包中其實包含了一些很重要的類,比如集合。如圖所示,這是集合家族的簡單示意圖,集合主要有兩大類,分別是Collection和Map,這是兩種不一樣的存儲方式。Collection是代表一組對象,包括多個元素(也可能是空元素),下面有List和Set接口,而Set接口有多個實現類,比如HashSet和TreeSet等,List接口有ArrayList和LinkedList實現類等,而Map則是鍵值對的存在方式,一個鍵對應一個值。常用的Map集合有HashMap和TreeMap,具體的實現類在後面會慢慢講解。
集合大家族簡單示意圖
Collection是集合層級結構的根,有一系列的子接口,比如List和Set,它規範了一系列行爲。比如以下規範:

  public boolean add(E object);
增加元素,返回值如果是true則是成功添加

    public boolean addAll(Collection<? extends E> collection);
嘗試添加所有元素到集合中,返回值同上

    public void clear();
清空集合

    public boolean contains(Object object);
是否包含指定的元素

    public boolean containsAll(Collection<?> collection);
是否包含參數集合中所有元素

    public boolean equals(Object object);
比較兩個對象(集合)是否相同

    public int hashCode();
返回hash碼,如果對象相同,則返回的hash碼也相同

    public boolean isEmpty();
判斷集合是否是空的(沒有數據)

    public Iterator<E> iterator();
是個迭代器,循環獲取數據用的

    public boolean remove(Object object);
刪除特定的數據

    public boolean removeAll(Collection<?> collection);
刪除所有數據

    public boolean retainAll(Collection<?> collection);
個人理解是元素刪除,只是刪除的是除了參數集合中的其他元素

    public int size();
返回集合中元素的數量

    public Object[] toArray();
集合轉換成數組

    public <T> T[] toArray(T[] array);
將集合中的元素放在一個特定的數組中T[],如果這個T[]夠大則放進去,如果不夠大,則重新創建新的數組

List是Collection的一個直接子接口,List中的元素是有序的,每個元素都有一個下標,可以通過下標獲取到元素,第一個下標是0,通常允許重複元素。List的具體實現有ArrayList,LinkedList等,List的源碼如下:

public void add(int location, E object);
插入特定元素到特定位置

public boolean add(E object);
添加一個元素到集合尾部

  public boolean addAll(int location, Collection<? extends E> collection);
在特定的位置插入整個集合

public boolean addAll(Collection<? extends E> collection);
在集合尾部插入整個集合

    public void clear();
清空集合元素

    public boolean contains(Object object);
是否包含某個元素

    public boolean containsAll(Collection<?> collection);
是否包含某個集合

    public boolean equals(Object object);
兩個集合是否相等

   public E get(int location);
根據位置獲取元素

    public int hashCode();
獲取huhash碼

    public int indexOf(Object object);
查找某個元素的位置(第一次出現)

    public boolean isEmpty();
是否爲空集合

    public Iterator<E> iterator();
迭代器

    public int lastIndexOf(Object object);
元素最後一次出現的下標

    public ListIterator<E> listIterator();
迭代器

   public ListIterator<E> listIterator(int location);

    public E remove(int location);
刪除某個特定位置的元素

    public boolean remove(Object object);
刪除某個元素

    public boolean removeAll(Collection<?> collection);
刪除參數中的集合中的元素

    public boolean retainAll(Collection<?> collection);
刪除不屬於參數中集合中的元素

    public E set(int location, E object);
替代特定位置中的元素

    public int size();
長度

    public List<E> subList(int start, int end);
截取相應的集合

    public Object[] toArray();
轉換成數組

    public <T> T[] toArray(T[] array);
放在指定數組,如果數組夠大則裝,不夠大新建數組

Set也是一個接口,直接繼承了Collection接口,Set的特點有:不允許有重複的元素,也就是說集合中任意兩個元素,有e1.equals(e2)返回是false的,最多隻有一個null元素,Set是無序的,意思是存進去的順序和取出來的順序基本不一致的。Set的具體實現有:HashSet,TreeSet等。Set的源碼如下:

int size();
獲取集合的元素總數量

boolean isEmpty();
是否是空集合,是的話則返回true

boolean contains(Object o);
判斷集合是否包含該元素

Iterator<E> iterator();
迭代器

Object[] toArray();
轉換爲數組

boolean add(E e);
新增元素,如果返回true表示添加成功

boolean addAll(Collection<? extends E> c);
新增整個集合

boolean remove(Object o);
刪除元素,true表示刪除成功

boolean containsAll(Collection<?> c);
是否包含特定集合裏的所有元素,

boolean removeAll(Collection<?> c);
刪除整個集合中的元素

boolean retainAll(Collection<?> c);
包含該集合,這個方法應該是跟上面那個方法互斥,

void clear();
清空集合

boolean equals(Object o);
比較集合

int hashCode();
獲取哈希碼,這是set很重要的方法,

Map是一種鍵值對形式數據結構,形如Map《K,V》的形式,Map中一般來說Key是唯一的,不能重複,一個key也對應一個value,Map的key值是否是有序的要看具體實現,映射的value是否可以爲空也看具體實現,Map的具體實現有:TreeMap,HashMap等。Map的源碼如下:

int size();
返回集合的鍵值對數量

boolean isEmpty();
是否包含鍵值對

boolean containsKey(Object key);
是否包含keyboolean containsValue(Object value);
是否包含value值

V get(Object key);
根據key值獲取對應映射的value

V put(K key, V value);
添加一對鍵值對,如果key原本存在,則用新的value替代原有的value,返回的是原有的value

V remove(Object key);
根據key來刪除鍵值對,如果返回value值存在代表刪除成功

void putAll(Map<? extends K, ? extends V> m);
添加整個Map集合

void clear();
清空鍵值對

Set<K> keySet();
返回所有的key組成的Set集合 (從這裏可以看出keySet集合的形式,也就說說key是不允許重複的)

Collection<V> values();
返回所有的value組成的集合

Set<Map.Entry<K, V>> entrySet();
返回鍵值對的形式

boolean equals(Object o);
比較集合是否相同

int hashCode();
返回哈希碼

分析了集合中三個重要的接口源碼,List,Set和Map,可以看出集合無非也是對數據的增刪改查操作。都有add(List和Set)或put(Map)來新增元素,remove來刪除元素,contains來查詢是否包含某個元素等。不過與數據持久化不一樣,集合中增加或修改數據並不能永久保留,也只是停留在內存裏,如果沒有做數據持久化,比如保存在磁盤或者網絡上,下次使用同一個集合,並沒有數據,還需要重新初始化,然後進行增刪改查等操作。
當然Java中具體集合是有很多的,以上三個接口只是代表了三種類型的集合,每種接口又有很多具體集合實現類,我們在具體應用中,應當根據應用的場景來選擇不同的集合。至於每種集合的不同特點,在什麼場景中選擇什麼集合,會在後面每個具體集合講解中詳細分析。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章