java集合

java集合

定義

Java語言的設(shè)計者對常用的數(shù)據(jù)結(jié)構(gòu)和算法做了一些規(guī)范(接口)和實現(xiàn)(具體實現(xiàn)接口的類)。所有抽象出來的數(shù)據(jù)結(jié)構(gòu)和操作(算法)統(tǒng)稱為Java集合框架

主要分類

1

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

總結(jié)

2
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,327評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,996評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,316評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,406評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,128評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,524評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,576評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,759評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,310評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,065評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,249評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,821評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,479評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,909評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,140評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,984評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,228評論 2 375

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