java集合
定義
Java語(yǔ)言的設(shè)計(jì)者對(duì)常用的數(shù)據(jù)結(jié)構(gòu)和算法做了一些規(guī)范(接口)和實(shí)現(xiàn)(具體實(shí)現(xiàn)接口的類)镣屹。所有抽象出來(lái)的數(shù)據(jù)結(jié)構(gòu)和操作(算法)統(tǒng)稱為Java集合框架
主要分類
Collection接口
迭代器
我們先來(lái)看下這個(gè)接口的定義:
public interface Collection<E> extends Iterable<E>
首先,它使用了一個(gè)類型參數(shù)猪叙;其次钞护,它實(shí)現(xiàn)了Iterable<E>接口窗轩,我們?cè)賮?lái)看下Iterable<E>接口的定義:
public interface Iterable<T> {
Iterator<T> iterator();
}
我們可以看到這個(gè)接口只定義了一個(gè)方法苹丸,這個(gè)方法要求我們返回一個(gè)實(shí)現(xiàn)了Iterator<T>類型的對(duì)象,所以我們看下Iterator<T>的定義:
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
說(shuō)到這里包归,我們簡(jiǎn)單地說(shuō)一下迭代器(Iterator)這個(gè)東西锨推。上面我們一共提到了兩個(gè)和迭代器相關(guān)的接口:Iterable<E>接口和Iterator<E>接口,從字面意義上來(lái)看公壤,前者的意思是“可迭代的”换可,后者的意思是“迭代器。所以我們可以這么理解這兩個(gè)接口:實(shí)現(xiàn)了Iterable<E>接口的類是可迭代的厦幅;實(shí)現(xiàn)了Iterator<E>接口的類是一個(gè)迭代器沾鳄。
迭代器就是一個(gè)我們用來(lái)遍歷集合中的對(duì)象的東西。也就是說(shuō)确憨,對(duì)于集合译荞,我們不是像對(duì)原始類型數(shù)組那樣通過(guò)數(shù)組索引來(lái)直接訪問(wèn)相應(yīng)位置的元素,而是通過(guò)迭代器來(lái)遍歷缚态。這么做的好處是將對(duì)于集合類型的遍歷行為與被遍歷的集合對(duì)象分離磁椒,這樣一來(lái)我們無(wú)需關(guān)心該集合類型的具體實(shí)現(xiàn)是怎樣的玫芦。只要獲取這個(gè)集合對(duì)象的迭代器, 便可以遍歷這個(gè)集合中的對(duì)象了。而像遍歷對(duì)象的順序這些細(xì)節(jié)桥帆,全部由它的迭代器來(lái)處理∩髦澹現(xiàn)在我們來(lái)梳理一下前面提到的這些東西:首先老虫,Collection接口實(shí)現(xiàn)了Iterable<E>接口,這意味著所有實(shí)現(xiàn)了Collection接口的具體集合類都是可迭代的茫多。
那么既然要迭代,我們就需要一個(gè)迭代器來(lái)遍歷相應(yīng)集合中的對(duì)象天揖,所以Iterable<E>接口要求我們實(shí)現(xiàn)iterator方法,這個(gè)方法要返回一個(gè)迭代器對(duì)象今膊。一個(gè)迭代器對(duì)象也就是實(shí)現(xiàn)了Iterator<E>接口的對(duì)象些阅,這個(gè)接口要求我們實(shí)現(xiàn)hasNext()、next()斑唬、remove()這三個(gè)方法黎泣。其中hasNext方法判斷是否還有下一個(gè)元素(即是否遍歷完對(duì)象了)缤谎,next方法會(huì)返回下一個(gè)元素(若沒(méi)有下一個(gè)元素了調(diào)用它會(huì)引起拋出一個(gè)NoSuchElementException異常),remove方法用于移除最近一次調(diào)用next方法返回的元素(若沒(méi)有調(diào)用next方法而直接調(diào)用remove方法會(huì)報(bào)錯(cuò))托呕。
我們可以想象在開(kāi)始對(duì)集合進(jìn)行迭代前洋访,有個(gè)指針指向集合第一個(gè)元素的前面镣陕,第一次調(diào)用next方法后姻政,這個(gè)指針會(huì)”掃過(guò)"第一個(gè)元素并返回它,調(diào)用hasNext方法就是看這個(gè)指針后面還有沒(méi)有元素了鹊碍。也就是說(shuō)這個(gè)指針始終指向剛遍歷過(guò)的元素和下一個(gè)待遍歷的元素之間食绿。通常,迭代一個(gè)集合對(duì)象的代碼是這個(gè)樣子的:
Collection<String> c = ...;
Iterator<String> iter = c.iterator();
while (iter.hasNext()) {
String element = iter.next();
//do something with element
}
從Java SE 5.0開(kāi)始耀销,我們可以使用與以上代碼段等價(jià)但是更加簡(jiǎn)潔的版本:
for (String element : c) {
//do something with element
}
Collection接口
Collection接口中定義了以下方法:
boolean add(E e) //向集合中添加一個(gè)元素铲汪,若添加元素后集合發(fā)生了變化就返回true,若沒(méi)有發(fā)生變化掌腰,就返回false。(optional operation).
boolean addAll(Collection<? extends E> c) //添加給定集合c中的所有元素到該集合中(optional operation).
void clear() //(optional operation).
boolean contains(Object o) //判斷該集合中是否包含指定對(duì)象
boolean containsAll(Collection<?> c)
boolean equals(Object o)
int hashCode()
boolean isEmpty()
Iterator<E> iterator()
boolean remove(Object o) //移除給定對(duì)象的一個(gè)實(shí)例(有的具體集合類型允許重復(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是一個(gè)有序的集合類型(也被
稱作序列)催植。使用List接口可以精確控制每個(gè)元素被插入的位置,并且可以通過(guò)元素在列表中的索引來(lái)訪問(wèn)它创南。列表允許重復(fù)的元素酵幕,并且在允許null元素的情況下也允許多個(gè)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) //在當(dāng)前位置添加一個(gè)元素
boolean hasNext() //返回ture如果還有下個(gè)元素(在正向遍歷列表時(shí)使用)
boolean hasPrevious() //反向遍歷列表時(shí)使用
E next() //返回下一個(gè)元素并將cursor(也就是我們上文提到的”指針“)前移一個(gè)位置
int nextIndex() //返回下一次調(diào)用next方法將返回的元素的索引
E previous() //返回前一個(gè)元素并將cursor向前移動(dòng)一個(gè)位置
int previousIndex() //返回下一次調(diào)用previous方法將返回的元素的索引void remove() //從列表中移除最近一次調(diào)用next方法或previous方法返回的元素
void set(E e) //用e替換最近依次調(diào)用next或previous方法返回的元素
ArrayList
定義:ArrayList是一個(gè)可動(dòng)態(tài)調(diào)整大小的數(shù)組邓深,允許null類型的元素。我們知道芥备,Java中的數(shù)組大小在初始化時(shí)就必須確定下來(lái),而且一旦確定就不能改變亦镶,這會(huì)使得在很多場(chǎng)景下不夠靈活袱瓮。ArrayList很好地幫我們解決了這個(gè)問(wèn)題,當(dāng)我們需要一個(gè)能根據(jù)包含元素的多少來(lái)動(dòng)態(tài)調(diào)整大小的數(shù)組時(shí)尺借,那么ArrayList正是我們所需要的燎斩。
特點(diǎn):
- 基于數(shù)組類型的數(shù)據(jù)結(jié)構(gòu)
- 查找快,增刪慢
常用方法:
boolean add(E e) //添加一個(gè)元素到數(shù)組末尾
void add(int index, E element) //添加一個(gè)元素到指定位置
void clear()
boolean contains(Object o)
void ensureCapacity(int minCapacity) //確保ArrayList至少能容納參數(shù)指定數(shù)目的對(duì)象栅表,若有需要會(huì)增加ArrayList實(shí)例的容量。
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類代表了一個(gè)雙向鏈表萧落,允許null元素洗贰。這個(gè)類同ArrayList一樣,不是線程安全的。
特點(diǎn):
- 基于鏈表類型的數(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ù)的元素,至多可以包含一個(gè)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接口并沒(méi)有顯式要求其中的元素是有序或是無(wú)序的
Queue接口
定義:Queue接口是對(duì)隊(duì)列這種數(shù)據(jù)結(jié)構(gòu)的抽象。一般的隊(duì)列實(shí)現(xiàn)允許我們高效的在隊(duì)尾添加元素述召,在隊(duì)列頭部刪除元素(First in, First out)。Queue<E>接口還有一個(gè)名為Deque的子接口积暖,它允許我們高效的在隊(duì)頭或隊(duì)尾添加/刪除元素夺刑,實(shí)現(xiàn)了Deque<E>的接口的集合類即為雙端隊(duì)列的一種實(shí)現(xiàn)(比如LinkedList就實(shí)現(xiàn)了Deque接口)。
方法:
boolean add(E e) //添加一個(gè)元素到隊(duì)列中遍愿,若隊(duì)列已滿會(huì)拋出一個(gè)IllegalStateException異常
E element() //獲取隊(duì)頭元素
boolean offer(E e) //添加一個(gè)元素到隊(duì)列中,若隊(duì)列已滿返回false
E peek() //獲取隊(duì)頭元素桅咆,若隊(duì)列為空返回null
E poll() //返回并移除隊(duì)頭元素倾哺,若隊(duì)列為空返回null
E remove() //返回并移除隊(duì)頭元素
Map接口
定義:一個(gè)把鍵映射到值的對(duì)象被稱作一個(gè)Map對(duì)象。映射表不能包含重復(fù)的鍵忌愚,每個(gè)鍵至多可以與一個(gè)值關(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) //放入指定的鍵值對(duì)
V remove(Object key)
int size()
Set<Map.Entry<K,V>> entrySet()
Set<K> keySet()
Collection<V> values()