java集合
定義
Java語言的設(shè)計者對常用的數(shù)據(jù)結(jié)構(gòu)和算法做了一些規(guī)范(接口)和實現(xiàn)(具體實現(xiàn)接口的類)。所有抽象出來的數(shù)據(jù)結(jié)構(gòu)和操作(算法)統(tǒng)稱為Java集合框架
主要分類
Collection接口
迭代器
我們先來看下這個接口的定義:
public interface Collection<E> extends Iterable<E>
首先,它使用了一個類型參數(shù);其次,它實現(xiàn)了Iterable<E>接口,我們再來看下Iterable<E>接口的定義:
public interface Iterable<T> {
Iterator<T> iterator();
}
我們可以看到這個接口只定義了一個方法,這個方法要求我們返回一個實現(xiàn)了Iterator<T>類型的對象,所以我們看下Iterator<T>的定義:
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
說到這里,我們簡單地說一下迭代器(Iterator)這個東西。上面我們一共提到了兩個和迭代器相關(guān)的接口:Iterable<E>接口和Iterator<E>接口,從字面意義上來看,前者的意思是“可迭代的”,后者的意思是“迭代器。所以我們可以這么理解這兩個接口:實現(xiàn)了Iterable<E>接口的類是可迭代的;實現(xiàn)了Iterator<E>接口的類是一個迭代器。
迭代器就是一個我們用來遍歷集合中的對象的東西。也就是說,對于集合,我們不是像對原始類型數(shù)組那樣通過數(shù)組索引來直接訪問相應(yīng)位置的元素,而是通過迭代器來遍歷。這么做的好處是將對于集合類型的遍歷行為與被遍歷的集合對象分離,這樣一來我們無需關(guān)心該集合類型的具體實現(xiàn)是怎樣的。只要獲取這個集合對象的迭代器, 便可以遍歷這個集合中的對象了。而像遍歷對象的順序這些細節(jié),全部由它的迭代器來處理。現(xiàn)在我們來梳理一下前面提到的這些東西:首先,Collection接口實現(xiàn)了Iterable<E>接口,這意味著所有實現(xiàn)了Collection接口的具體集合類都是可迭代的。
那么既然要迭代,我們就需要一個迭代器來遍歷相應(yīng)集合中的對象,所以Iterable<E>接口要求我們實現(xiàn)iterator方法,這個方法要返回一個迭代器對象。一個迭代器對象也就是實現(xiàn)了Iterator<E>接口的對象,這個接口要求我們實現(xiàn)hasNext()、next()、remove()這三個方法。其中hasNext方法判斷是否還有下一個元素(即是否遍歷完對象了),next方法會返回下一個元素(若沒有下一個元素了調(diào)用它會引起拋出一個NoSuchElementException異常),remove方法用于移除最近一次調(diào)用next方法返回的元素(若沒有調(diào)用next方法而直接調(diào)用remove方法會報錯)。
我們可以想象在開始對集合進行迭代前,有個指針指向集合第一個元素的前面,第一次調(diào)用next方法后,這個指針會”掃過"第一個元素并返回它,調(diào)用hasNext方法就是看這個指針后面還有沒有元素了。也就是說這個指針始終指向剛遍歷過的元素和下一個待遍歷的元素之間。通常,迭代一個集合對象的代碼是這個樣子的:
Collection<String> c = ...;
Iterator<String> iter = c.iterator();
while (iter.hasNext()) {
String element = iter.next();
//do something with element
}
從Java SE 5.0開始,我們可以使用與以上代碼段等價但是更加簡潔的版本:
for (String element : c) {
//do something with element
}
Collection接口
Collection接口中定義了以下方法:
boolean add(E e) //向集合中添加一個元素,若添加元素后集合發(fā)生了變化就返回true,若沒有發(fā)生變化,就返回false。(optional operation).
boolean addAll(Collection<? extends E> c) //添加給定集合c中的所有元素到該集合中(optional operation).
void clear() //(optional operation).
boolean contains(Object o) //判斷該集合中是否包含指定對象
boolean containsAll(Collection<?> c)
boolean equals(Object o)
int hashCode()
boolean isEmpty()
Iterator<E> iterator()
boolean remove(Object o) //移除給定對象的一個實例(有的具體集合類型允許重復(fù)元素) (optional operation).
boolean removeAll(Collection<?> c) //(optional operation).
boolean retainAll(Collection<?> c) //僅保留給定集合c中的元素(optional operation).
int size()
Object[] toArray()
<T> T[] toArray(T[] a)
List接口
定義:List是一個有序的集合類型(也被
稱作序列)。使用List接口可以精確控制每個元素被插入的位置,并且可以通過元素在列表中的索引來訪問它。列表允許重復(fù)的元素,并且在允許null元素的情況下也允許多個null元素。
方法:
ListIterator<E> listIterator();
void add(int i, E element);
E remove(int i);
E get(int i);
E set(int i, E element);
int indexOf(Object element);
ListIterator<E>接口的方法:
void add(E e) //在當前位置添加一個元素
boolean hasNext() //返回ture如果還有下個元素(在正向遍歷列表時使用)
boolean hasPrevious() //反向遍歷列表時使用
E next() //返回下一個元素并將cursor(也就是我們上文提到的”指針“)前移一個位置
int nextIndex() //返回下一次調(diào)用next方法將返回的元素的索引
E previous() //返回前一個元素并將cursor向前移動一個位置
int previousIndex() //返回下一次調(diào)用previous方法將返回的元素的索引void remove() //從列表中移除最近一次調(diào)用next方法或previous方法返回的元素
void set(E e) //用e替換最近依次調(diào)用next或previous方法返回的元素
ArrayList
定義:ArrayList是一個可動態(tài)調(diào)整大小的數(shù)組,允許null類型的元素。我們知道,Java中的數(shù)組大小在初始化時就必須確定下來,而且一旦確定就不能改變,這會使得在很多場景下不夠靈活。ArrayList很好地幫我們解決了這個問題,當我們需要一個能根據(jù)包含元素的多少來動態(tài)調(diào)整大小的數(shù)組時,那么ArrayList正是我們所需要的。
特點:
- 基于數(shù)組類型的數(shù)據(jù)結(jié)構(gòu)
- 查找快,增刪慢
常用方法:
boolean add(E e) //添加一個元素到數(shù)組末尾
void add(int index, E element) //添加一個元素到指定位置
void clear()
boolean contains(Object o)
void ensureCapacity(int minCapacity) //確保ArrayList至少能容納參數(shù)指定數(shù)目的對象,若有需要會增加ArrayList實例的容量。
E get(int index) //返回指定位置的元素
int indexOf(Object o)
boolean isEmpty()
Iterator<E> iterator()
ListIterator<E> listIterator()
E remove(int index)
boolean remove(Object o)
E set(int index, E element)
int size()
LinkedList
定義:LinkedList類代表了一個雙向鏈表,允許null元素。這個類同ArrayList一樣,不是線程安全的。
特點:
- 基于鏈表類型的數(shù)據(jù)結(jié)構(gòu)
- 增刪快,查找慢
方法:
void addFirst(E element);
void addLast(E element);
E getFirst();
E getLast();
E removeFirst();
E removeLast();
add方法:
boolean add(E e) //把元素e添加到鏈表末尾
void add(int index, E element) //在指定索引處添加元素
Set接口
定義:Set接口與List接口的重要區(qū)別就是它不支持重復(fù)的元素,至多可以包含一個null類型元素。Set接口定義的是數(shù)學(xué)意義上的“集合”概念。
方法:
boolean add(E e)
void clear()
boolean contains(Object o)
boolean isEmpty()
boolean equals(Object obj)
Iterator<E> iterator()
boolean remove(Object o)
boolean removeAll(Collection<?> c)
int size()
Object[] toArray()
<T> T[] toArray(T[] a)
Set接口并沒有顯式要求其中的元素是有序或是無序的
Queue接口
定義:Queue接口是對隊列這種數(shù)據(jù)結(jié)構(gòu)的抽象。一般的隊列實現(xiàn)允許我們高效的在隊尾添加元素,在隊列頭部刪除元素(First in, First out)。Queue<E>接口還有一個名為Deque的子接口,它允許我們高效的在隊頭或隊尾添加/刪除元素,實現(xiàn)了Deque<E>的接口的集合類即為雙端隊列的一種實現(xiàn)(比如LinkedList就實現(xiàn)了Deque接口)。
方法:
boolean add(E e) //添加一個元素到隊列中,若隊列已滿會拋出一個IllegalStateException異常
E element() //獲取隊頭元素
boolean offer(E e) //添加一個元素到隊列中,若隊列已滿返回false
E peek() //獲取隊頭元素,若隊列為空返回null
E poll() //返回并移除隊頭元素,若隊列為空返回null
E remove() //返回并移除隊頭元素
Map接口
定義:一個把鍵映射到值的對象被稱作一個Map對象。映射表不能包含重復(fù)的鍵,每個鍵至多可以與一個值關(guān)聯(lián)。
方法:
void clear()
boolean containsKey(Object key) //判斷是否包含指定鍵
boolean containsValue(Object value) //判斷是否包含指定值
boolean isEmpty()
V get(Object key) //返回指定鍵映射的值
V put(K key, V value) //放入指定的鍵值對
V remove(Object key)
int size()
Set<Map.Entry<K,V>> entrySet()
Set<K> keySet()
Collection<V> values()