什么是集合(Collection)巩螃?集合就是“由若干個(gè)確定的元素所構(gòu)成的整體”媒峡。
在數(shù)學(xué)中翠桦,我們經(jīng)常遇到集合的概念。例如:
- 有限集合:
- 一個(gè)班所有的同學(xué)構(gòu)成的集合糊渊;
- 一個(gè)網(wǎng)站所有的商品構(gòu)成的集合右核;
- ...
- 無(wú)限集合:
- 全體自然數(shù)集合:1,2渺绒,3贺喝,……
- 有理數(shù)集合;
- 實(shí)數(shù)集合宗兼;
- ...
為什么要在計(jì)算機(jī)中引入集合呢躏鱼?這是為了便于處理一組類(lèi)似的數(shù)據(jù),例如:
- 計(jì)算所有同學(xué)的總成績(jī)和平均成績(jī)殷绍;
- 列舉所有的商品名稱(chēng)和價(jià)格染苛;
- ……
在Java中,如果一個(gè)Java對(duì)象可以在內(nèi)部持有若干其他Java對(duì)象篡帕,并對(duì)外提供訪問(wèn)接口殖侵,我們把這種Java對(duì)象稱(chēng)為集合贸呢。很顯然镰烧,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ù)類(lèi)型,可以充當(dāng)集合楞陷,那么怔鳖,我們?yōu)槭裁催€需要其他集合類(lèi)?這是因?yàn)閿?shù)組有如下限制:
數(shù)組初始化后大小不可變固蛾;數(shù)組只能按索引順序存取结执。
因此,我們需要各種不同類(lèi)型的集合類(lèi)來(lái)處理不同的數(shù)據(jù)艾凯,例如:
- 可變大小的順序鏈表献幔;
- 保證無(wú)重復(fù)元素的集合;
- ...
Collection
Java標(biāo)準(zhǔn)庫(kù)自帶的java.util
包提供了集合類(lèi):Collection
趾诗,它是除Map
外所有其他集合類(lèi)的根接口蜡感。Java
的java.util
包主要提供了以下三種類(lèi)型的集合:
List
:一種有序列表的集合蹬蚁,例如,按索引排列的Student
的List
郑兴;
Set
:一種保證沒(méi)有重復(fù)元素的集合犀斋,例如,所有無(wú)重復(fù)名稱(chēng)的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)類(lèi)相分離虫几,例如,有序表的接口是List
挽拔,具體的實(shí)現(xiàn)類(lèi)有ArrayList
持钉,LinkedList
等,二是支持泛型篱昔,我們可以限制在一個(gè)集合中只能放入同一種數(shù)據(jù)類(lèi)型的元素每强,例如:
List<String> list = new ArrayList<>(); // 只能放入String類(lèi)型
最后,Java訪問(wèn)集合總是通過(guò)統(tǒng)一的方式——迭代器(Iterator)來(lái)實(shí)現(xiàn)州刽,它最明顯的好處在于無(wú)需知道集合內(nèi)部元素是按什么方式存儲(chǔ)的空执。
由于Java的集合設(shè)計(jì)非常久遠(yuǎn),中間經(jīng)歷過(guò)大規(guī)模改進(jìn)穗椅,我們要注意到有一小部分集合類(lèi)是遺留類(lèi)辨绊,不應(yīng)該繼續(xù)使用:
-
Hashtable
:一種線(xiàn)程安全的Map
實(shí)現(xiàn); -
Vector
:一種線(xiàn)程安全的List
實(shí)現(xiàn)匹表; -
Stack
:基于Vector
實(shí)現(xiàn)的LIFO
的棧门坷。
還有一小部分接口是遺留接口,也不應(yīng)該繼續(xù)使用:
-
Enumeration<E>
:已被Iterator<E>
取代袍镀。
小結(jié)
Java的集合類(lèi)定義在java.util
包中默蚌,支持泛型,主要提供了3種集合類(lèi)苇羡,包括List
绸吸,Set
和Map
。Java集合使用統(tǒng)一的Iterator
遍歷设江,盡量不要使用遺留接口锦茁。