Java容器可以說是增強程序員編程能力的基本工具,本系列將帶您深入理解容器類。
如果對象的數量與生命周期都是固定的,自然我們也就不需要很復雜的數據結構。
我們可以通過創建引用來持有對象,如
Class clazz;
也可以通過數組來持有多個對象,如
Class[] clazs = new Class[10];
然而,一般情況下,我們並不知道要創建多少對象,或者以何種方式創建對象。數組顯然只能創建固定長度的對象,為了使程序變得更加靈活與高效,Java類庫提供了一套完整的容器類,具備完善的方法來解決上述問題。
2. 容器的類別
觀察上圖,我們可以得出容器主要分為兩種類型,兩個接口Collection與Map定義了兩類不同的對象存儲方式。
Collection用以保存單一的元素,Map保存關聯鍵值對。通過泛型來指定容器存放的數據類型。 Iterator 設計的目的是在未知容器具體的類型的情況下,用來遍歷容器元素。剩下的容器類型都是繼承了這兩個接口。
在實際編碼中,通過向上轉型為接口,在其與代碼中都使用這個接口是非常普遍的使用方式。如下:
import java.util.*; public class TestCollection { public static void main(String[] args){ Collection<Integer> c = new ArrayList<Integer>(); for(int i = 0; i < 10; i++){ c.add(i); } for(Integer i : c){ System.out.print(i + ", "); } } }
注:由於List接口的方法比Collection更為豐富,所以 實際應用中,ArrayList向上轉型為List更為合適。
剛剛接觸容器的朋友們可能會只把Collection與Map當做接口,實際上並非如此,容器中的接口其實有六個。
3. 容器中的七大接口
其中List, Queue和Set接口繼承了Collection接口,剩下的接口之間都是相互獨立的,無繼承關系。List和Set接口主要是為了區分是否要包含重復元素,Iterater迭代器則是為了更靈活的迭代集合,與foreach一起使用。Comparable接口則用於比較。
4. 各類容器的功能(主要實現類分析)
實現List接口,類似於動態數組,適用於大量隨機訪問的情況。但插入和刪除的代價非常高昂
實現List接口,類似於鏈表,也提供了優化的順序訪問。在插入和刪除方面代價低廉,隨機訪問代價較高
HashSet使用了散列函數實現,極大的提高了訪問速度。存入HashSet的對象必須定義hashCode()
import java.util.*; public class IntegerSet{ private static Random rand; public static void main(String[] args){ rand = new Random(47); Set<Integer> intset = new HashSet<Integer>(); for(int i = 0; i < 10000; i++){ intset.add(rand.nextInt(30)); } System.out.println(intset); } }
本例中,intset中插入了10000次,由於不保留重復元素最後輸出結果數目<=30。
TreeSet使用紅黑樹來實現存儲元素, 紅黑樹的好處是可以插入之後維持集合的有序性。
import java.util.*; public class SortIntegerSet { private static Random rand; public static void main(String[] args) { rand = new Random(47); Set<Integer> sintset = new TreeSet<Integer>(); for(int i = 0; i < 10000; i++){ sintset.add(rand.nextInt(20)); } System.out.println(sintset); } }
顧名思義,LinkedHashSet使用了鏈表來保持插入順序,不過為了提高查詢效率,也使用了散列。
LinkedList實現了Queue接口,提供了方法支持隊列的行為,在以後的系列我們會深入講解如何用
LinkedList實現隊列。
與普通隊列不同,優先隊列每次彈出的是優先級最高的元素。可以通過提供自己的Comparator來修改
默認的優先級順序。
HashMap通過散列機制,用來快速訪問。
TreeMap保持"key"處於排序狀態,訪問速度不如HashMap
LinkedHashMap保持元素插入時順序,同時提供散列實現快速訪問
關於Map的散列實現是非常重要的,實現Map的原理(關聯數組等),hashCode()方法的理解,本系列後面會一一分析。
5. 總結
通過本文的學習,相信讀者對容器的用途,分類,以及容器的層次結構與一些常用容器的基本功能和用法有了較為清晰地了解。然而,想要更好的使用容器類,還必須了解每種容器具體的方法,源碼,以及線程安全的實現。在本系列的後續部分,將帶大家繼續深入討論這些內容。
如果覺得本文對您有所幫助的話,就給俺推薦一個吧~
作者:I'm coding
鏈接:http://www.cnblogs.com/ACFLOOD/
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。