java集合

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集合框架

主要分類

1

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()

總結(jié)

2
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末腊徙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子撬腾,更是在濱河造成了極大的恐慌,老刑警劉巖胰默,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漓踢,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡奴迅,警方通過(guò)查閱死者的電腦和手機(jī)挺据,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)脖隶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)者填,“玉大人,你說(shuō)我怎么就攤上這事心墅≌ズ酰” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵铐姚,是天一觀的道長(zhǎng)肛捍。 經(jīng)常有香客問(wèn)我隐绵,道長(zhǎng)依许,這世上最難降的妖魔是什么缀蹄? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮缺前,結(jié)果婚禮上衅码,老公的妹妹穿的比我還像新娘。我一直安慰自己逝段,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著棺牧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪参淹。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天恳不,我揣著相機(jī)與錄音开呐,去河邊找鬼。 笑死筐付,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沮尿。 我是一名探鬼主播较解,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼啡捶!你這毒婦竟也來(lái)了当编?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤金顿,失蹤者是張志新(化名)和其女友劉穎鲤桥,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體茶凳,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贮喧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了箱沦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡灶伊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出竹椒,到底是詐尸還是另有隱情米辐,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布舶吗,位于F島的核電站择膝,受9級(jí)特大地震影響誓琼,放射性物質(zhì)發(fā)生泄漏肴捉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一傲隶、第九天 我趴在偏房一處隱蔽的房頂上張望窃页。 院中可真熱鬧,春花似錦乒省、人聲如沸畦木。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至惨篱,卻和暖如春围俘,著一層夾襖步出監(jiān)牢的瞬間机断,已是汗流浹背绣夺。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工欢揖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人她混。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓坤按,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親臭脓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容