9.1-全栈Java笔记: 容器泛型—认识Collection接口
開發和學習中需要時刻和數據打交道,如果組織這些數據是我們編程中重要的內容。?我們一般通過“容器”來容納和管理數據。
?
事實上,數組就是一種容器,可以在其中放置對象或基本類型數據。
數組的優勢:是一種簡單的線性序列,可以快速的訪問數組元素,效率高。如果從效率和類型檢查的角度講,數組是最好的。
數組的劣勢:不靈活:容量事先定義好,不能隨著需求的變化而擴容。比如:我們在一個用戶管理系統中,要把今天注冊的所有用戶取出來,那么這個用戶有多少個?我們在寫程序時是無法確定的。因此,就不能使用數組。
?
因此,數組遠遠不能滿足我們對于“管理和組織數據的需求”。我們需要一種更強大、更靈活的,容量隨時可擴的容器來裝載我們的對象。?這就是我們今天要學習的容器,或者叫集合。
?? ?圖1?容器中的接口層次結構
泛型Generics
泛型是JDK5.0以后增加的,他可以幫助我們建立類型安全的集合。在使用了泛型的中,不必進行強制類型轉換。JDK提供了支持泛型的編譯器,將運行時的類型檢查提前到了編譯時執行,使代碼可讀性和安全性更高。
?
泛型的本質就是“數據類型的參數化”。?我們可以把“泛型”理解為類型的一個占位符(形式參數),即告訴編譯器,在調用泛型時必須傳入實際類型。
自定義泛型
我們可以在類的聲明處增加泛型列表,如:<T,E,V>。?此處,字符可以是任何標識符,一般采用這3個字母。
【示例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像一個占位符一樣表示“未知的某個數據類型”,我們在真正調用的時候傳入這個“數據類型”。
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); ??? } } |
容器中使用泛型
容器相關類都定義了泛型,我們在開發和工作中,在使用容器類時都要使用泛型。這樣,在容器的存儲數據、讀取數據都避免了大量的類型判斷,非常便捷。
【示例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(); } |
通過閱讀源碼,我們發現Collection、List、Set、Map、Iterator接口都定義了泛型:
因此,我們在使用這些接口及其實現類時,都要使用泛型。
菜鳥雷區 ????我們只是強烈建議使用泛型。事實上,不使用編譯器也不會報錯! |
Collection接口
Collection?表示一組對象,它是集中、收集的意思。Collection接口的兩個子接口是List、Set接口。
Collection接口中定義的方法
方法 | 說明 |
boolean? ? add(Object element) | 增加元素到容器中 |
boolean? ? remove(Object element) | 從容器中移除元素 |
boolean? ? contains(Object element) | 容器中是否包含該元素 |
int??? ? size() | 容器中元素的數量 |
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() | 轉化成Object數組 |
由于List、Set是Collection的子接口,意味著所有List、Set的實現類都有上面的方法。我們下一節中,通過ArrayList實現類來測試上面的方法。
「全棧Java筆記」是一部能幫大家從零到一成長為全棧Java工程師系列筆記。筆者江湖人稱 Mr. G,10年Java研發經驗,曾在神州數碼、航天院某所研發中心從事軟件設計及研發工作,從小白逐漸做到工程師、高級工程師、架構師。精通Java平臺軟件開發,精通JAVAEE,熟悉各種流行開發框架。
筆記包含從淺入深的六大部分:
A-Java入門階段
B-數據庫從入門到精通
C-手刃移動前端和Web前端
D-J2EE從了解到實戰
E-Java高級框架精解
F-Linux和Hadoop?
轉載于:https://blog.51cto.com/javanew/1943391
總結
以上是生活随笔為你收集整理的9.1-全栈Java笔记: 容器泛型—认识Collection接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洛谷P1119 灾后重建 图论 脑
- 下一篇: 带你入门 CSS Grid 布局