Collection是一個接口,是高度抽象出來的集合,它包含了集合的基本操做和屬性。java
集合是存儲對象的容器,面相對象語言對事物的體現都是以對象的形式,因此爲了方便對多個對象的操做,存儲對象,集合是存儲對象最經常使用的一種方式。git
集合的出現就是爲了持有對象。集合中能夠存儲任意類型,並且長度可變。在程序中有可能沒法預知須要多少個對象,那麼用數組來裝對象的話,長度很差定義,而集合解決了這樣的問題。github
上圖是Java集合框架圖,這邊咱們就只先看Iterator接口、Collection接口和其子接口。數組
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的定義以下:函數
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的定義以下:線程
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的定義以下:
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的定義以下:
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的區別
Java提供了一套實現了Collection接口的標準集合類。其中一些事具體類,這些類能夠直接拿來使用,而另一些是抽象類,提供了接口的部分實現。
文章做者:leisurexi
新博客地址:https://leisurexi.github.io/
許可協議: 署名-非商業性使用-禁止演繹 4.0 國際 轉載請保留原文連接及做者。