天天看點

Java集合系列——總序

Java集合系列目錄:

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

一、概要

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,具體的實作類在後面會慢慢講解。

Java集合系列——總序

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);
是否包含key值

boolean 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集合 (從這裡可以看出key是Set集合的形式,也就說說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中具體集合是有很多的,以上三個接口隻是代表了三種類型的集合,每種接口又有很多具體集合實作類,我們在具體應用中,應當根據應用的場景來選擇不同的集合。至于每種集合的不同特點,在什麼場景中選擇什麼集合,會在後面每個具體集合講解中詳細分析。