9.1-全栈Java笔记: 容器泛型—认识Collection接口
開(kāi)發(fā)和學(xué)習(xí)中需要時(shí)刻和數(shù)據(jù)打交道,如果組織這些數(shù)據(jù)是我們編程中重要的內(nèi)容。?我們一般通過(guò)“容器”來(lái)容納和管理數(shù)據(jù)。
?
事實(shí)上,數(shù)組就是一種容器,可以在其中放置對(duì)象或基本類型數(shù)據(jù)。
數(shù)組的優(yōu)勢(shì):是一種簡(jiǎn)單的線性序列,可以快速的訪問(wèn)數(shù)組元素,效率高。如果從效率和類型檢查的角度講,數(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以后增加的,他可以幫助我們建立類型安全的集合。在使用了泛型的中,不必進(jìn)行強(qiáng)制類型轉(zhuǎn)換。JDK提供了支持泛型的編譯器,將運(yùn)行時(shí)的類型檢查提前到了編譯時(shí)執(zhí)行,使代碼可讀性和安全性更高。
?
泛型的本質(zhì)就是“數(shù)據(jù)類型的參數(shù)化”。?我們可以把“泛型”理解為類型的一個(gè)占位符(形式參數(shù)),即告訴編譯器,在調(diào)用泛型時(shí)必須傳入實(shí)際類型。
自定義泛型
我們可以在類的聲明處增加泛型列表,如:<T,E,V>。?此處,字符可以是任何標(biāo)識(shí)符,一般采用這3個(gè)字母。
【示例1】泛型類的聲明
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ù)類型”,我們?cè)谡嬲{(diào)用的時(shí)候傳入這個(gè)“數(shù)據(jù)類型”。
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類型 ? ? ? ?System.out.println(str); ??? } } |
容器中使用泛型
容器相關(guān)類都定義了泛型,我們?cè)陂_(kāi)發(fā)和工作中,在使用容器類時(shí)都要使用泛型。這樣,在容器的存儲(chǔ)數(shù)據(jù)、讀取數(shù)據(jù)都避免了大量的類型判斷,非常便捷。
【示例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)類時(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)類都有上面的方法。我們下一節(jié)中,通過(guò)ArrayList實(shí)現(xiàn)類來(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?
轉(zhuǎn)載于:https://blog.51cto.com/javanew/1943391
總結(jié)
以上是生活随笔為你收集整理的9.1-全栈Java笔记: 容器泛型—认识Collection接口的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 洛谷P1119 灾后重建 图论 脑
- 下一篇: Java中包、类、方法、属性、常量的命名