
第11章 java集合框架和泛型機制
1、概念 JDK API在java.util包中設計了一組專門用來存儲其它對象的類,這組類被稱為對象容器類,簡稱容器類,這組類和接口的設計結構也被稱為集合框架。 Collection接口有一個超級接口:Iterator(用于遍歷); Collection接口的子接口常用的有:List 和 Set; List,有序有重復;Set,無序無重復。 元素:元素即對象(數據)的引用 重復:調用equals方法進行相等判斷 有序:存放順序即輸出的順序 Map接口,用于維護鍵/值對。 常用工具類:Collections
2、Iterator接口 所有實現了Collection接口的集合類都有一個 iterator()方法用以返回一人實現了Iterator接口的對象。 Iterator對象稱作迭代器,用以方便的實現對集合內元素的遍歷操作。 Iterator接口中定義的方法: boolean hashNext(); Object next(); void remove();
3、Set接口(無序無重復) Set接口沒有提供Collection 接口額外的方法,但實現Set接口的集合類中的元素是不可重復的。 Set的實現類主要有:HashSet及其子類 LinkedHashSet
4、HashSet 特點:檢索數據的效率比較高。 HashSet:不保存元素的加入順序,它根據元素的哈希碼進行存放,所以取出這個元素時也可以根據哈希碼快速找到。 注意:在添加自定義類對象到HashSet時,自定義類必須重寫hashCode和equals方法進行對象重復的判斷。 HashSet通過hashCode()方法和equals()方法實現對數據相等的判斷。 可以往HashSet中添加null值,也只能添加一次相同的null元素。
5、LinkedHashSet 特點:采用雙向表鏈接的方式進行數據的存儲。 因為此特點,LinkedHashSet對元素的插入和刪除效率比較高,對于檢索效率要較低。 LinkedHashSet在存放元素時,會記錄每個元素的HashCode值,輸出時會根據HashCode值的順序(先進先出)進行輸出,但是LinkedHashSet在底層對于數據的存放和HashSet原理一致。
6、List接口(有序有重復) List的實現類主要有:Vector、 ArrayList、 LinkedList 實現List接口的集合類中的元素是有序的,且允許重復。 List集合中的元素都對應一個整數型的序號記載其在集合中的位置,可以根據序號存取集合中的元素。
7、ArrayList ArrayList底層通過動態數組來實現對元素的存儲, ArrayList類能夠自動增加或者減小其本身存儲數據的大小, 當目前數據的大小超過了ArrayList目前存放的大小,這時ArrayList會自動進行大小的調整。 ArrayList 存儲元素時會保存元素順序。 優點: 對于使用索引取出元素有較好的效率 它使用索引來快速定位對象 缺點: 元素做刪除或插入速度較慢 因為使用了數組,需要移動后面的元素以調整索引順序。
8.LinkedList LinkedList是使用雙向鏈表實現的集合。 LinkedList新增了一些插入、刪除的方法。 如:addFirst()、addLast()、 優點: 對頻繁的插入或刪除元素有較好的效率
9.Vector vector和ArrayList大多數方法和功能都類似,實現原理基本一致 vector是線程安全的 特點:Vector對于檢索效率也比較高,但由于線程問題,ArrayList檢索的效率高于Vector vector常用方法:addElement(Object obj)、 insertElementAt(Object obj, int index)、……
10、Map接口 Map常用實現類:HashMap及子類LinkedHashMap、PRoperties Map實現類中存儲的“鍵-值”映射對 通過鍵來唯一標識。Map底層的“鍵”是用Set來存放的,因此是無序無重復的。
11、HashMap 基于哈希表的Map接口的實現,它是使用頻率最高的一個容器,提供所有可選的映射操作,它內部對“鍵”用Set進行散列存放。所以根據“鍵”去取“值”的效果很高。并且允許使用 null 值和null 鍵,但它不保證映射順序。 1.HashMap底層通過Set對鍵進行散列存放。 2.對于HashMap中的鍵要求要重寫hashCode和equals方法 3.HashMap中允許鍵值都為null 4.HashMap映射的順序沒有保證 5.常用String作為Map的“鍵”。 6.HashMap檢索數據效率比較高 7.直接輸出Map對象時,以大括號擴住,并且以鍵=值的形式輸出
12.LinkedHashMap LinkedHashMap是HashMap的子類 特點:對插入刪除操作效率高 輸出元素有一定的順序(按照添加的順序進行輸出)
13.HashTable HashTabel和HashMap區別: 1.HashTable是線程安全的 2.HashTable不允許給鍵值對添加null值
14.Properties Properties類是HashTable的子類,表示了一個持久屬性集。它可保存在流中或人流中加載,屬性列表中每個鍵及其對應值都是一個字符串。 在屬性文件中注釋采用# 使用步驟: 1.獲取文件流 InputStream iStream=Thread.currentThread().getContextClassLoader().getResourceAsStream("名稱.properties"); 2.創建Properties對象 Properties pro=new Properties(); 3.加載流對象到Properties對象中,調用load方法可能會發生IOException pro.load(iStream); 4.通過調用getProperty("key") 獲取數據.
15、集合類的選擇 存放要求: 無序:Set 不能重復 有序:List 允許重復 “Key-value”對 Map 讀寫要求: Hash* 兩者都高 HashCode Array* 讀快寫慢 Linked* 讀慢改快 Tree* 加入元素可排序使用
16.Collections集合幫助類 java.util.Collections類是操作集合的工具類,提供了一些靜態方法實現了基于集合的一些常用算法 void sort(List list) 根據元素的自然順序 對指定List列表按升序進行排序。List列表中的所有元素都必須實現 Comparable 接口。 void shuffle(List list) 對List列表內的元素進行隨機排列 void reverse(List list) 對List列表內的元素進行反轉 void copy(List dest, List src) 將src列表內的元素復制到dest列表中 List synchronizedList(List list) 返回指定列表支持的同步(線程安全的)列表
17.泛型 泛型,就是在定義(類、方法、形式參數、成員變量等)的時候,指定它為通用類型,也就是數據類型可以是任意的類型。具體調用的時候,要將通過類型轉換成指定的類型來使用。 聲明泛型類對象語法: 類名<數據類型> 對象名稱=new 類名<數據類型>(); 泛型使用: 1:消除類型轉換 2:自動解包裝或包裝 3:限制泛型中類型參數的范圍 <?> 通用類型 <? extends Number> 只允許Number以及Number的子類來引用 <? super Number> 只允許Number以及Number的父類引用 4:泛型方法 <T>通用類型 <T extends Number> 只允許Number以及Number的子類來引用 <T super Number> 只允許Number以及Number的父類引用 <T super Number&Comparable> 只允許Number以及Number的父類且實現了Comparable接口的實現類引用 5.泛型類 在類的定義中添加一個泛型參數列表,可以將類泛型化 6.注意 靜態方法中不能使用類的泛型,因為泛型類中的泛型在創建類的對象時被替換為確定類型。 在Java中沒有類型的變量或對象是不允許直接訪問的。 不要創建泛型類的對象,因為泛型類可能是一個接口或抽象類。 不能在catch 子句中使用泛型,因為若try子句拋出是已檢查異常,編譯器無法確定catch能否捕獲。
新聞熱點
疑難解答