Collection

Collection是一個接口,是高度抽象出來的集合,它包含了集合的基本操做和屬性。java

什麼是集合

集合是存儲對象的容器,面相對象語言對事物的體現都是以對象的形式,因此爲了方便對多個對象的操做,存儲對象,集合是存儲對象最經常使用的一種方式。git

集合的出現就是爲了持有對象。集合中能夠存儲任意類型,並且長度可變。在程序中有可能沒法預知須要多少個對象,那麼用數組來裝對象的話,長度很差定義,而集合解決了這樣的問題。github

集合和數組的區別

  • 數組的長度是固定的,集合長度是可變的。
  • 數組中能夠存儲基本數據類型,集合只能存儲對象(Java集合實際存放的只是對象的引用,每一個集合元素都是一個引用變量,實際內容都放在堆內存或方法區裏面,可是基本數據類型是在棧內存上分配空間的,棧上的數據隨時就會被收回)。
  • 數組中存儲數據類型是單一的,集合中能夠存儲任意類型的對象。

集合接口

Java集合框架圖

上圖是Java集合框架圖,這邊咱們就只先看Iterator接口、Collection接口和其子接口。數組

Iterator簡介

Iterator的定義以下:數據結構

public interface Iterable<T> {}

Iterator是一個接口,它是集合的迭代器。集合能夠經過Iterator去遍歷集合中的元素。多線程

注意:Iterator遍歷Collection時,是fail-fast機制的。即,當某一個線程A經過iterator去遍歷某集合的過程當中,若該集合的內容被其餘線程所改變了;那麼線程A訪問集合時,就會拋ConcurrentModificationException異常,產生fail-fast事件。框架

// Iterator的API
abstract boolean hasNext()
abstract E next()
abstract void remove()

ListIterator簡介

ListIterator的定義以下:函數

public interface ListIterator<E> extends Iterator<E> {}

ListIterator是一個繼承於Iterator的接口。它是隊列迭代器,專門用於遍歷List,能提供向前/向後遍歷。相比於Iterator,它新增了添加、是否存在上一個元素、獲取上一個元素等API接口。性能

// ListIterator的API
// 繼承於Iterator的接口
abstract boolean hasNext()
abstract E next()
abstract void remove()
// 新增API接口
abstract void add(E object)
abstract boolean hasPrevious()
abstract int nextIndex()
abstract E previous()
abstract int previousIndex()
abstract void set(E object)

Collection簡介

Collection的定義以下:線程

public interface Collection<E> extends Iterable<E> {}

它是一個接口,是高度抽象出來的集合,它包含了集合的基本操做:添加、刪除、狀況、遍歷、是否爲空、獲取大小、是否保護某元素等等。一個Collection表明一組Object,即Collection的元素;Collection接口存儲一組不惟一,無序的對象。

Collection接口的全部子類(直接子類或間接子類)都必須實現2中構造函數:不帶參數的構造函數和參數類型爲Collection的構造函數。帶參數的構造函數,能夠用來轉換Collection的類型。

// Collection的API
abstract boolean         add(E object)
abstract boolean         addAll(Collection<? extends E> collection)
abstract void            clear()
abstract boolean         contains(Object object)
abstract boolean         containsAll(Collection<?> collection)
abstract boolean         equals(Object object)
abstract int             hashCode()
abstract boolean         isEmpty()
abstract Iterator<E>     iterator()
abstract boolean         remove(Object object)
abstract boolean         removeAll(Collection<?> collection)
abstract boolean         retainAll(Collection<?> collection)
abstract int             size()
abstract <T> T[]         toArray(T[] array)
abstract Object[]        toArray()

List簡介

List的定義以下:

public interface List<E> extends Collection<E> {}

List是一個繼承於Collection的接口,即List是集合的一種。List是有序的隊列,List中的每個元素都有一個索引;第一個元素的索引是0,日後的元素的索引值依次+1,並且容許有相同的元素。List接口存儲一組不惟一,有序的對象。

關於API方面。既然List是繼承於Collection接口,它天然就包含了Collection中的所有函數接口;因爲List是有序隊列,它也有本身額外的API接口。主要有添加、刪除、獲取元素、修改指定位置的元素、獲取List中的子隊列等。

// Collection的API
abstract boolean         add(E object)
abstract boolean         addAll(Collection<? extends E> collection)
abstract void            clear()
abstract boolean         contains(Object object)
abstract boolean         containsAll(Collection<?> collection)
abstract boolean         equals(Object object)
abstract int             hashCode()
abstract boolean         isEmpty()
abstract Iterator<E>     iterator()
abstract boolean         remove(Object object)
abstract boolean         removeAll(Collection<?> collection)
abstract boolean         retainAll(Collection<?> collection)
abstract int             size()
abstract <T> T[]         toArray(T[] array)
abstract Object[]        toArray()
// 相比與Collection,List新增的API:
abstract void                add(int location, E object)
abstract boolean             addAll(int location, Collection<? extends E> collection)
abstract E                   get(int location)
abstract int                 indexOf(Object object)
abstract int                 lastIndexOf(Object object)
abstract ListIterator<E>     listIterator(int location)
abstract ListIterator<E>     listIterator()
abstract E                   remove(int location)
abstract E                   set(int location, E object)
abstract List<E>             subList(int start, int end)

Set簡介

Set的定義以下:

public interface Set<E> extends Collection<E> {}

Set是一個繼承於Collection的接口,Set具備和Collection徹底同樣的接口,只是行爲上不一樣,Set不保存重複的元素。Set接口存儲一組惟一,無序的對象。

// Set的API(跟Collection的API徹底同樣)
abstract boolean         add(E object)
abstract boolean         addAll(Collection<? extends E> collection)
abstract void             clear()
abstract boolean         contains(Object object)
abstract boolean         containsAll(Collection<?> collection)
abstract boolean         equals(Object object)
abstract int             hashCode()
abstract boolean         isEmpty()
abstract Iterator<E>     iterator()
abstract boolean         remove(Object object)
abstract boolean         removeAll(Collection<?> collection)
abstract boolean         retainAll(Collection<?> collection)
abstract int             size()
abstract <T> T[]         toArray(T[] array)
abstract Object[]         toArray()

Set和List的區別

  • Set接口實例存儲的無序的、不重複的數據;List接口實例存儲的是有序的、能夠重複的數據。
  • Set檢索效率低下,刪除和插入效率高,插入和刪除並不會引發元素位置改變。
  • List和數組類型,能夠動態增加,根據實際存儲的數據長度自動增加List的長度。查找元素效率高,插入、刪除效率低,由於會引發其餘元素的位置改變。

集合實現類

Java提供了一套實現了Collection接口的標準集合類。其中一些事具體類,這些類能夠直接拿來使用,而另一些是抽象類,提供了接口的部分實現。

  • AbstractCollection
    • 實現了大部分Collection接口的方法。
  • AbstractList
    • 繼承於AbstractCollection,而且實現了大部分List接口的方法。
  • AbstractSequentialList
    • 繼承於AbstractList,提供了對數據元素的鏈式訪問而不是隨機訪問。
  • LinkedList
    • 實現了List接口,容許有null(空)元素;主要用於建立鏈表數據結構。該類不是同步的,多線程狀況下不要使用。
    • LinkedList查找效率低。
  • ArrayList
    • 實現了List接口,實現了可變大小的數組,隨機訪問和遍歷元素時,提供更好的性能。該類也是非同步的,在多線程狀況下不要使用。ArrayList增加當前長度的50%。
    • ArrayList插入、刪除效率低。
  • AbstractSet
    • 繼承於AbstractCollection,而且實現了大部分Set接口的方法。
  • HashSet
    • 實現了Set接口,不容許出現重複元素,不保證集合中元素的順序,容許包含值爲null的元素,但最多隻能一個。
  • LinkedHashSet
    • 繼承HashSet,實現了Set接口。具備可預知迭代順序。
  • TreeSet
    • 實現了Set接口,能夠根據元素的大小進行排序。

總結

  1. 集合是一個對象,可容納其餘對象的引用。集合接口聲明每一中類型的集合能夠執行的操做。
  2. 任何對象加入集合類後,自動轉變爲Object類型,因此在取出的時候,須要強制類型轉換。

文章做者:leisurexi

新博客地址:https://leisurexi.github.io/

許可協議: 署名-非商業性使用-禁止演繹 4.0 國際 轉載請保留原文連接及做者。

相關文章
相關標籤/搜索