Java中的容器


在書寫程序的時候,我們常常需要對大量的對象引用進行管理。為了實現有效的歸類管理,我們常常將同類的引用放置在同一數據容器中。

由於數據容器中存放了我們隨時可能需要使用到的對象引用,所以一般的數據容器要都要能能提供方便的查詢、遍歷、修改等基本接口功能。

早期的OOP語言都通過數組的方式來實現對引用集的集中管理和維護。

但是數組方式下,數組大小需要提前被確定,並不允許修改大小,導致其作為一種靈活的數據容器的能力的功能大為下降。

 

為了方便的利用數據容器進行引用的管理,Java中提供了豐富的數據容器以滿足程序員多樣化的需求。

JAVA的容器---List,Map,Set 
Collection 
├List 
│├LinkedList 
│├ArrayList 
│└Vector 
│ └Stack 
└Set 
Map 
├Hashtable 
├HashMap 
└WeakHashMap

!其中的Vector和Stack類現在已經極少使用。

 

從容器類圖中可以發現,數據容器主要分為了兩類:

Collection: 存放獨立元素的序列。

Map:存放key-value型的元素對。(這對於一些需要利用key查找value的程序十分的重要!)

從類體系圖中可以看出,Collection定義了Collection類型數據的最基本、最共性的功能接口,而List對該接口進行了拓展。

其中各個類的適用場景有很大的差別,在使用時,應該根據需要靈活的進行選擇。此處介紹最為常用的四個容器:

LinkedList :其數據結構采用的是鏈表,此種結構的優勢是刪除和添加的效率很高,但隨機訪問元素時效率較ArrayList類低。

ArrayList:其數據結構采用的是線性表,此種結構的優勢是訪問和查詢十分方便,但添加和刪除的時候效率很低。

HashSet: Set類不允許其中存在重復的元素(集),無法添加一個重復的元素(Set中已經存在)。HashSet利用Hash函數進行了查詢效率上的優化,其contain()方法經常被使用,以用於判斷相關元素是否已經被添加過。

HashMap: 提供了key-value的鍵值對數據存儲機制,可以十分方便的通過鍵值查找相應的元素,而且通過Hash散列機制,查找十分的方便。

 

 

該類圖的理解,對於靈活的使用相應的數據容器十分的重要。

根據Oracle公司的官方文檔:

1、Collection是對Iterable接口的拓展故所有的Collection對象都可以使用foreach方式,對元素進行方便的遍歷。

由於Iterable接口中定義了的唯一方法為:返回一個Iterator對象,故所有的Collection都可以用 對象名.iterator()的方式獲取該collection的迭代器iterator對象(結合工廠方法和內部類的思想來理解,其作用十分大)

2、Map中提供了產生Collection的方法,以支持方便的對鍵值對的值域進行操作。

Collection<V> values()   Returns:a collection view of the values contained in this map.

 

從JAVA提供的數據容器來看,可以清晰的認識到面向對象的思想在類的架構設計中的重要性。

靈活的使用好各類容器類,以最大限度的提升程序的性能。由於類型過多,大多的基礎操作都被抽象到了Collection中,熟練並利用好Collection提供的接口,已經可以解決大量的問題(即使是Map,其也提供了產生Collection對象的機制)。

 

Example:

public class TestContainer {
Collection<String> testList= new ArrayList<String>(Arrays.asList("i love you".split(" ")));
Map<Integer, String> testMap=new HashMap<Integer, String>();

TestContainer()
{
testMap.put(1, "I");
testMap.put(2, "love");
testMap.put(3, "you");


print(testMap);
print(testList);

print("Using Iterable Interface");
for(String str:testList)
{
print(str);
}

print("Geting the values collection of a Map");
Collection<String> mapValues= testMap.values();
for(String str:mapValues)
{
print(str);
}

print("Geting the Iterator of a collection");
Iterator i=mapValues.iterator();
while(i.hasNext())
{
print(i.next());
}
}
}

 以上的例子中,TestContainer的實例會有連個數據成員:

1、ArrayList<String>     testList

2、Map<Integer, String>   testMap

為了對ArrayList進行遍歷,此例中直接將ArrayList向上轉型為了Collection類型(結合類圖),並利用foreach遍歷方式對其中的成員進行了遍歷。

為了對Map中的value域進行訪問,此處調用了Collection<String> mapValues= testMap.values(); ,使用Map的values()方法返回了其value成員的Collection對象。

於是可以像操縱其它Collection一樣,對該集合進行操作!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM