集合

什么是集合(Collection)?集合就是“由若干個(gè)確定的元素所構(gòu)成的整體”彩郊。例如前弯,5只小兔構(gòu)成的集合:

┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐

│ (_(\ (_/) (_/) (_/) ((\ │
( -.-) (?.?) (>.<) (.) (='.')
│ C(")(") (")(") (")(") (")(") O(_")") │

└ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘
一組類似的數(shù)據(jù)

在Java中,如果一個(gè)Java對(duì)象可以在內(nèi)部持有若干其他Java對(duì)象秫逝,并對(duì)外提供訪問(wèn)接口恕出,我們把這種Java對(duì)象稱為集合。很顯然违帆,Java的數(shù)組可以看作是一種集合:

String[] ss = new String[10]; // 可以持有10個(gè)String對(duì)象
ss[0] = "Hello"; // 可以放入String對(duì)象
String first = ss[0]; // 可以獲取String對(duì)象

既然Java提供了數(shù)組這種數(shù)據(jù)類型浙巫,可以充當(dāng)集合,那么刷后,我們?yōu)槭裁催€需要其他集合類的畴?這是因?yàn)閿?shù)組有如下限制:

  • 數(shù)組初始化后大小不可變;
  • 數(shù)組只能按索引順序存取尝胆。

因此丧裁,我們需要各種不同類型的集合類來(lái)處理不同的數(shù)據(jù),例如:

  • 可變大小的順序鏈表含衔;
  • 保證無(wú)重復(fù)元素的集合煎娇;
    Collection
    Java標(biāo)準(zhǔn)庫(kù)自帶的java.util包提供了集合類:Collection二庵,它是除Map外所有其他集合類的根接口。Java的java.util包主要提供了以下三種類型的集合:

List:一種有序列表的集合缓呛,例如催享,按索引排列的Student的List;
Set:一種保證沒(méi)有重復(fù)元素的集合哟绊,例如因妙,所有無(wú)重復(fù)名稱的Student的Set;
Map:一種通過(guò)鍵值(key-value)查找的映射表集合匿情,例如兰迫,根據(jù)Student的name查找對(duì)應(yīng)Student的Map。
Java集合的設(shè)計(jì)有幾個(gè)特點(diǎn):一是實(shí)現(xiàn)了接口和實(shí)現(xiàn)類相分離炬称,例如汁果,有序表的接口是List,具體的實(shí)現(xiàn)類有ArrayList玲躯,LinkedList等据德,二是支持泛型,我們可以限制在一個(gè)集合中只能放入同一種數(shù)據(jù)類型的元素跷车,例如:

List<String> list = new ArrayList<>(); // 只能放入String類型

最后棘利,Java訪問(wèn)集合總是通過(guò)統(tǒng)一的方式——迭代器(Iterator)來(lái)實(shí)現(xiàn),它最明顯的好處在于無(wú)需知道集合內(nèi)部元素是按什么方式存儲(chǔ)的朽缴。
Java的集合類定義在java.util包中善玫,支持泛型,主要提供了3種集合類密强,包括List茅郎,Set和Map。Java集合使用統(tǒng)一的Iterator遍歷或渤,盡量不要使用遺留接口系冗。

List

在集合類中,List是最基礎(chǔ)的一種集合:它是一種有序列表薪鹦。
ArrayList把添加和刪除的操作封裝起來(lái)掌敬,讓我們操作List類似于操作數(shù)組,卻不用關(guān)心內(nèi)部元素如何移動(dòng)池磁。

我們考察List<E>接口奔害,可以看到幾個(gè)主要的接口方法:

在末尾添加一個(gè)元素:boolean add(E e)
在指定索引添加一個(gè)元素:boolean add(int index, E e)
刪除指定索引的元素:int remove(int index)
刪除某個(gè)元素:int remove(Object e)
獲取指定索引的元素:E get(int index)
獲取鏈表大小(包含元素的個(gè)數(shù)):int size()

但是地熄,實(shí)現(xiàn)List接口并非只能通過(guò)數(shù)組(即ArrayList的實(shí)現(xiàn)方式)來(lái)實(shí)現(xiàn)舀武,另一種LinkedList通過(guò)“鏈表”也實(shí)現(xiàn)了List接口。在LinkedList中离斩,它的內(nèi)部每個(gè)元素都指向下一個(gè)元素:
┌───┬───┐ ┌───┬───┐ ┌───┬───┐ ┌───┬───┐
HEAD ──>│ A │ ●─┼──> │ B │ ●─┼──> │ C │ ●─┼──> │ D │ │
└───┴───┘ └───┴───┘ └───┴───┘ └───┴───┘
我們來(lái)比較一下ArrayList和LinkedList:

                          ArrayList LinkedList

獲取指定元素 速度很快 需要從頭開始查找元素
添加元素到末尾 速度很快 速度很快
在指定位置添加/刪除 需要移動(dòng)元素 不需要移動(dòng)元素
內(nèi)存占用 少 較大
通常情況下银舱,我們總是優(yōu)先使用ArrayList瘪匿。
ArrayList類中

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable {

    public Iterator<E> iterator() {
        return new ArrayList.Itr();
    }
}
private class Itr implements Iterator<E> {
        int cursor;
        int lastRet = -1;
        int expectedModCount;

        Itr() {
            this.expectedModCount = ArrayList.this.modCount;
        }

        public boolean hasNext() {
            return this.cursor != ArrayList.this.size;
        }

        public E next() {... 具體實(shí)現(xiàn)}
}

所以我們要始終堅(jiān)持使用迭代器Iterator來(lái)訪問(wèn)List。Iterator本身也是一個(gè)接口寻馏,但它是由List的實(shí)例調(diào)用iterator()方法的時(shí)候創(chuàng)建的棋弥。Iterator對(duì)象知道如何遍歷一個(gè)List,并且不同的List類型诚欠,返回的Iterator對(duì)象實(shí)現(xiàn)也是不同的顽染,但總是具有最高的訪問(wèn)效率。

實(shí)際上轰绵,只要實(shí)現(xiàn)了Iterable接口的集合類都可以直接用for each循環(huán)來(lái)遍歷粉寞,Java編譯器本身并不知道如何遍歷集合對(duì)象,但它會(huì)自動(dòng)把for each循環(huán)變成Iterator的調(diào)用左腔,原因就在于Iterable接口定義了一個(gè)Iterator<E> iterator()方法唧垦,強(qiáng)迫集合類必須返回一個(gè)Iterator實(shí)例。

有序列表集合液样,有索引振亮,類似數(shù)組
數(shù)組添加刪除操作不方便
ArrayList把添加刪除操作都封裝起來(lái),讓我們操作List類似于操作數(shù)組鞭莽,卻不關(guān)心內(nèi)容元素如何移動(dòng)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坊秸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子澎怒,更是在濱河造成了極大的恐慌褒搔,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喷面,死亡現(xiàn)場(chǎng)離奇詭異暮胧,居然都是意外死亡存炮,警方通過(guò)查閱死者的電腦和手機(jī)放棒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門矛物,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)侮措,“玉大人蓉冈,你說(shuō)我怎么就攤上這事烘浦【纹辏” “怎么了生宛?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵县昂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我陷舅,道長(zhǎng)倒彰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任莱睁,我火速辦了婚禮待讳,結(jié)果婚禮上芒澜,老公的妹妹穿的比我還像新娘。我一直安慰自己创淡,他們只是感情好痴晦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著琳彩,像睡著了一般誊酌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上露乏,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天碧浊,我揣著相機(jī)與錄音,去河邊找鬼瘟仿。 笑死箱锐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的猾骡。 我是一名探鬼主播瑞躺,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼兴想!你這毒婦竟也來(lái)了幢哨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤嫂便,失蹤者是張志新(化名)和其女友劉穎捞镰,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毙替,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岸售,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了厂画。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凸丸。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖袱院,靈堂內(nèi)的尸體忽然破棺而出屎慢,到底是詐尸還是另有隱情,我是刑警寧澤忽洛,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布腻惠,位于F島的核電站,受9級(jí)特大地震影響欲虚,放射性物質(zhì)發(fā)生泄漏集灌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一复哆、第九天 我趴在偏房一處隱蔽的房頂上張望欣喧。 院中可真熱鬧腌零,春花似錦、人聲如沸唆阿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)酷鸦。三九已至饰躲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間臼隔,已是汗流浹背嘹裂。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摔握,地道東北人寄狼。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像氨淌,于是被迫代替她去往敵國(guó)和親泊愧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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