開(kāi)發(fā)和學(xué)習(xí)中需要時(shí)刻和數(shù)據(jù)打交道尔邓,如果組織這些數(shù)據(jù)是我們編程中重要的內(nèi)容晾剖。?我們一般通過(guò)“容器”來(lái)容納和管理數(shù)據(jù)锉矢。
?
事實(shí)上,數(shù)組就是一種容器齿尽,可以在其中放置對(duì)象或基本類(lèi)型數(shù)據(jù)沽损。
數(shù)組的優(yōu)勢(shì):是一種簡(jiǎn)單的線性序列,可以快速的訪問(wèn)數(shù)組元素雕什,效率高缠俺。如果從效率和類(lèi)型檢查的角度講,數(shù)組是最好的贷岸。
數(shù)組的劣勢(shì):不靈活:容量事先定義好壹士,不能隨著需求的變化而擴(kuò)容。比如:我們?cè)谝粋€(gè)用戶管理系統(tǒng)中偿警,要把今天注冊(cè)的所有用戶取出來(lái)躏救,那么這個(gè)用戶有多少個(gè)?我們?cè)趯?xiě)程序時(shí)是無(wú)法確定的螟蒸。因此盒使,就不能使用數(shù)組。
?
因此七嫌,數(shù)組遠(yuǎn)遠(yuǎn)不能滿足我們對(duì)于“管理和組織數(shù)據(jù)的需求”少办。我們需要一種更強(qiáng)大、更靈活的诵原,容量隨時(shí)可擴(kuò)的容器來(lái)裝載我們的對(duì)象英妓。?這就是我們今天要學(xué)習(xí)的容器,或者叫集合绍赛。
?? ?圖1?容器中的接口層次結(jié)構(gòu)
泛型Generics
泛型是JDK5.0以后增加的蔓纠,他可以幫助我們建立類(lèi)型安全的集合。在使用了泛型的中吗蚌,不必進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換腿倚。JDK提供了支持泛型的編譯器,將運(yùn)行時(shí)的類(lèi)型檢查提前到了編譯時(shí)執(zhí)行蚯妇,使代碼可讀性和安全性更高敷燎。
泛型的本質(zhì)就是“數(shù)據(jù)類(lèi)型的參數(shù)化”。?我們可以把“泛型”理解為類(lèi)型的一個(gè)占位符(形式參數(shù))侮措,即告訴編譯器懈叹,在調(diào)用泛型時(shí)必須傳入實(shí)際類(lèi)型。
自定義泛型
我們可以在類(lèi)的聲明處增加泛型列表分扎,如:<T,E,V>澄成。?此處,字符可以是任何標(biāo)識(shí)符,一般采用這3個(gè)字母墨状。
【示例1】泛型類(lèi)的聲明
class?? MyCollection<E> {?
??? Object[]?objs?=?new?? Object[5];
????public?E? get(int?? index){
???????return?? (E)objs[index];
??? }
????public?void?? set(E e ,int?index){
???????objs[index] ? = e;
??? }
}
泛型E像一個(gè)占位符一樣表示“未知的某個(gè)數(shù)據(jù)類(lèi)型”卫漫,我們?cè)谡嬲{(diào)用的時(shí)候傳入這個(gè)“數(shù)據(jù)類(lèi)型”。
public?class?? TestGenerics {
????public?static?void?? main(String[] args) {
?????? MyCollection<String> mc =?new?? MyCollection<String>();
?????? mc.set("aaa", ? 0);
?????? mc.set("bbb", ? 1);
??? ??? String str = ? mc.get(1);??//由于加了泛型肾砂,直接返回的就是String類(lèi)型
? ? ? ?System.out.println(str);
??? }
}
容器中使用泛型
容器相關(guān)類(lèi)都定義了泛型列赎,我們?cè)陂_(kāi)發(fā)和工作中,在使用容器類(lèi)時(shí)都要使用泛型镐确。這樣包吝,在容器的存儲(chǔ)數(shù)據(jù)、讀取數(shù)據(jù)都避免了大量的類(lèi)型判斷源葫,非常便捷诗越。
【示例2】泛型的使用
public?static?void?main(String[] args) {
?????? List<String> list =?new?ArrayList<String>();
?????? Set<Man> mans =?new?HashSet<Man>();
?????? Map<Integer, Man> maps =?new?? HashMap<Integer, Man>();
?????? Iterator<Man> iterator = mans.iterator();
}
通過(guò)閱讀源碼,我們發(fā)現(xiàn)Collection息堂、List嚷狞、Set、Map荣堰、Iterator接口都定義了泛型:
因此床未,我們?cè)谑褂眠@些接口及其實(shí)現(xiàn)類(lèi)時(shí),都要使用泛型振坚。
菜鳥(niǎo)雷區(qū)
????我們只是強(qiáng)烈建議使用泛型薇搁。事實(shí)上,不使用編譯器也不會(huì)報(bào)錯(cuò)渡八!
Collection接口
Collection?表示一組對(duì)象只酥,它是集中、收集的意思呀狼。Collection接口的兩個(gè)子接口是List、Set接口损离。
Collection接口中定義的方法
方法
說(shuō)明
boolean? ? add(Object element)
增加元素到容器中
boolean? ? remove(Object element)
從容器中移除元素
boolean? ? contains(Object element)
容器中是否包含該元素
int??? ? size()
容器中元素的數(shù)量
boolean? ? isEmpty()
容器是否為空
void? ? clear()
清空容器中所有元素
Iterator? ? iterator()
獲得迭代器哥艇,用于遍歷所有元素
boolean containsAll(Collection c)
本容器是否包含c容器所有元素
boolean? ? addAll(Collection c)
將容器c中所有元素增加到本容器
boolean? ??removeAll(Collection c)
移除本容器和容器C中都包含的元素
boolean? ? retainAll(Collection c)
取本容器和容器C中都包含的元素,移除非交集元素
Object[] toArray()
轉(zhuǎn)化成Object數(shù)組
由于List僻澎、Set是Collection的子接口貌踏,意味著所有List、Set的實(shí)現(xiàn)類(lèi)都有上面的方法窟勃。我們下一節(jié)中祖乳,通過(guò)ArrayList實(shí)現(xiàn)類(lèi)來(lái)測(cè)試上面的方法。
「全棧Java筆記」是一部能幫大家從零到一成長(zhǎng)為全棧Java工程師系列筆記秉氧。筆者江湖人稱 Mr. G眷昆,10年Java研發(fā)經(jīng)驗(yàn),曾在神州數(shù)碼、航天院某所研發(fā)中心從事軟件設(shè)計(jì)及研發(fā)工作亚斋,從小白逐漸做到工程師作媚、高級(jí)工程師、架構(gòu)師帅刊。精通Java平臺(tái)軟件開(kāi)發(fā)纸泡,精通JAVAEE,熟悉各種流行開(kāi)發(fā)框架赖瞒。
筆記包含從淺入深的六大部分:
A-Java入門(mén)階段
B-數(shù)據(jù)庫(kù)從入門(mén)到精通
C-手刃移動(dòng)前端和Web前端
D-J2EE從了解到實(shí)戰(zhàn)
E-Java高級(jí)框架精解
F-Linux和Hadoop?