<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    paulwong

    Java容器類Collection、List、ArrayList、Vector及map、HashTable、HashMap區(qū)別

    Collection是List和Set兩個接口的基接口
    List在Collection之上增加了"有序"
    Set在Collection之上增加了"唯一"

    而ArrayList是實現(xiàn)List的類...所以他是有序的.
    它里邊存放的元素在排列上存在一定的先后順序

    而且ArrayList是采用數(shù)組存放元素
    另一種List LinkedList采用的則是鏈表。

    Collection和Map接口之間的主要區(qū)別在于:Collection中存儲了一組對象,而Map存儲關(guān)鍵字/值對。
    在Map對象中,每一個關(guān)鍵字最多有一個關(guān)聯(lián)的值。
    Map:不能包括兩個相同的鍵,一個鍵最多能綁定一個值。null可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應(yīng)的
    值為null。當(dāng)get()方法返回null值時,即可以表示Map中沒有該鍵,也可以表示該鍵所對應(yīng)的值為null。因此,在Map中不能由get()方法來判斷Map中是否存在某個鍵,而應(yīng)該用containsKey()方法來判斷。
    繼承Map的類有:HashMap,HashTable
    HashMap:Map的實現(xiàn)類,缺省情況下是非同步的,可以通過Map Collections.synchronizedMap(Map m)來達到線程同步
    HashTable:Dictionary的子類,缺省是線程同步的。不允許關(guān)鍵字或值為null

    當(dāng)元素的順序很重要時選用TreeMap,當(dāng)元素不必以特定的順序進行存儲時,使用HashMap。Hashtable的使用不被推薦,因為HashMap提供了所有類似的功能,并且速度更快。當(dāng)你需要在多線程環(huán)境下使用時,HashMap也可以轉(zhuǎn)換為同步的。

    為什么要使用集合類
    當(dāng)你事先不知道要存放數(shù)據(jù)的個數(shù),或者你需要一種比數(shù)組下標(biāo)存取機制更靈活的方法時,你就需要用到集合類。

    理解集合類
    集合類存放于java.util包中。
    集合類存放的都是對象的引用,而非對象本身,出于表達上的便利,我們稱集合中的對象就是指集合中對象的引用(reference)。
    集合類型主要有3種:set(集)、list(列表)和map(映射)。

    (1)集 (Set):口袋
    集(set)是最簡單的一種集合,它的對象不按特定方式排序,只是簡單的把對象加入集合中,就像往口袋里放東西。
    對集中成員的訪問和操作是通過集中對象的引用進行的,所以集中不能有重復(fù)對象。
    集也有多種變體,可以實現(xiàn)排序等功能,如TreeSet,它把對象添加到集中的操作將變?yōu)榘凑漳撤N比較規(guī)則將其插入到有序的對象序列中。它實現(xiàn)的是SortedSet接口,也就是加入了對象比較的方法。通過對集中的對象迭代,我們可以得到一個升序的對象集合。

    (2)列表 (List):列表
    列表的主要特征是其對象以線性方式存儲,沒有特定順序,只有一個開頭和一個結(jié)尾,當(dāng)然,它與根本沒有順序的集是不同的。
    列表在數(shù)據(jù)結(jié)構(gòu)中分別表現(xiàn)為:數(shù)組和向量、鏈表、堆棧、隊列。
    關(guān)于實現(xiàn)列表的集合類,是我們?nèi)粘9ぷ髦薪?jīng)常用到的,將在后邊的筆記詳細介紹。

    (3)映射 (Map):鍵值對
    映射與集或列表有明顯區(qū)別,映射中每個項都是成對的。映射中存儲的每個對象都有一個相關(guān)的關(guān)鍵字(Key)對象,關(guān)鍵字決定了對象在映射中的存儲位置,檢索對象時必須提供相應(yīng)的關(guān)鍵字,就像在字典中查單詞一樣。關(guān)鍵字應(yīng)該是唯一的。
    關(guān)鍵字本身并不能決定對象的存儲位置,它需要對過一種散列(hashing)技術(shù)來處理,產(chǎn)生一個被稱作散列碼(hash code)的整數(shù)值,散列碼通常用作一個偏置量,該偏置量是相對于分配給映射的內(nèi)存區(qū)域起始位置的,由此確定關(guān)鍵字/對象對的存儲位置。理想情況下,散列處理應(yīng)該產(chǎn)生給定范圍內(nèi)均勻分布的值,而且每個關(guān)鍵字應(yīng)得到不同的散列碼。

    集合類簡介
    java.util中共有13個類可用于管理集合對象,它們支持集、列表或映射等集合,以下是這些類的簡單介紹

    集:
    HashSet: 使用HashMap的一個集的實現(xiàn)。雖然集定義成無序,但必須存在某種方法能相當(dāng)高效地找到一個對象。使用一個HashMap對象實現(xiàn)集的存儲和檢索操作是在固定時間內(nèi)實現(xiàn)的.
    TreeSet: 在集中以升序?qū)ο笈判虻募膶崿F(xiàn)。這意味著從一個TreeSet對象獲得第一個迭代器將按升序提供對象。TreeSet類使用了一個TreeMap.
    列表:
    Vector: 實現(xiàn)一個類似數(shù)組一樣的表,自動增加容量來容納你所需的元素。使用下標(biāo)存儲和檢索對象就象在一個標(biāo)準的數(shù)組中一樣。你也可以用一個迭代器從一個Vector中檢索對象。Vector是唯一的同步容器類??當(dāng)兩個或多個線程同時訪問時也是性能良好的。(同步的含義:即同時只能一個進程訪問,其他等待)
    Stack: 這個類從Vector派生而來,并且增加了方法實現(xiàn)棧??一種后進先出的存儲結(jié)構(gòu)。
    LinkedList: 實現(xiàn)一個鏈表。由這個類定義的鏈表也可以像棧或隊列一樣被使用。
    ArrayList: 實現(xiàn)一個數(shù)組,它的規(guī)模可變并且能像鏈表一樣被訪問。它提供的功能類似Vector類但不同步。
    映射:
    HashTable: 實現(xiàn)一個映象,所有的鍵必須非空。為了能高效的工作,定義鍵的類必須實現(xiàn)hashcode()方法和equal()方法。這個類是前面java實現(xiàn)的一個繼承,并且通常能在實現(xiàn)映象的其他類中更好的使用。
    HashMap: 實現(xiàn)一個映象,允許存儲空對象,而且允許鍵是空(由于鍵必須是唯一的,當(dāng)然只能有一個)。
    WeakHashMap: 實現(xiàn)這樣一個映象:通常如果一個鍵對一個對象而言不再被引用,鍵/對象對將被舍棄。這與HashMap形成對照,映象中的鍵維持鍵/對象對的生命周期,盡管使用映象的程序不再有對鍵的引用,并且因此不能檢索對象。
    TreeMap: 實現(xiàn)這樣一個映象,對象是按鍵升序排列的。

    下圖是集合類所實現(xiàn)的接口之間的關(guān)系:
    Set和List都是由公共接口Collection擴展而來,所以它們都可以使用一個類型為Collection的變量來引用。這就意味著任何列表或集構(gòu)成的集合都可以用這種方式引用,只有映射類除外(但也不是完全排除在外,因為可以從映射獲得一個列表。)所以說,把一個列表或集傳遞給方法的標(biāo)準途徑是使用Collection類型的參數(shù)。

    List接口
    List是有序的Collection,使用此接口能夠精確的控制每個元素插入的位置。用戶能夠使用索引(元素在List中的位置,類似于數(shù)組下標(biāo))來訪問List中的元素,這類似于Java的數(shù)組。
    和下面要提到的Set不同,List允許有相同的元素。
    除了具有Collection接口必備的iterator()方法外,List還提供一個listIterator()方法,返回一個ListIterator接口,和標(biāo)準的Iterator接口相比,ListIterator多了一些add()之類的方法,允許添加,刪除,設(shè)定元素,還能向前或向后遍歷。
    實現(xiàn)List接口的常用類有LinkedList,ArrayList,Vector和Stack。
    ArrayList類
    ArrayList實現(xiàn)了可變大小的數(shù)組。它允許所有元素,包括null。ArrayList沒有同步。
    size,isEmpty,get,set方法運行時間為常數(shù)。但是add方法開銷為分攤的常數(shù),添加n個元素需要O(n)的時間。其他的方法運行時間為線性。
    每個ArrayList實例都有一個容量(Capacity),即用于存儲元素的數(shù)組的大小。這個容量可隨著不斷添加新元素而自動增加,但是增長算法并沒有定義。ArrayList當(dāng)需要插入大量元素時,在插入前可以調(diào)用ensureCapacity方法來增加ArrayList的容量以提高插入效率。
    和LinkedList一樣,ArrayList也是非同步的(unsynchronized)。
    Map接口
    請注意,Map沒有繼承Collection接口,Map提供key到value的映射。一個Map中不能包含相同的key,每個key只能映射一個value。Map接口提供3種集合的視圖,Map的內(nèi)容可以被當(dāng)作一組key集合,一組value集合,或者一組key-value映射。
    HashMap類
    HashMap和Hashtable類似,不同之處在于HashMap是非同步的,并且允許null,即null value和null key。,但是將HashMap視為Collection時(values()方法可返回Collection),其迭代子操作時間開銷和HashMap的容量成比例。因此,如果迭代操作的性能相當(dāng)重要的話,不要將HashMap的初始化容量設(shè)得過高,或者load factor過低。
    ----------------------------------------------------------------------------
    1.-------------------->
    List是接口,List特性就是有序,會確保以一定的順序保存元素.
    ArrayList是它的實現(xiàn)類,是一個用數(shù)組實現(xiàn)的List.
    Map是接口,Map特性就是根據(jù)一個對象查找對象.
    HashMap是它的實現(xiàn)類,HashMap用hash表實現(xiàn)的Map,就是利用對象的hashcode(hashcode()是Object的方法)進行快速(Hash)散列查找.(關(guān)于散列查找,可以參看<<數(shù)據(jù)結(jié)構(gòu)>>)
    2.-------------------->
    一般情況下,如果沒有必要,推薦代碼只同List,Map接口打交道.
    比如:List list = new ArrayList();
    這樣做的原因是list就相當(dāng)于是一個泛型的實現(xiàn),如果想改變list的類型,只需要:
    List list = new LinkedList();//LinkedList也是List的實現(xiàn)類,也是ArrayList的兄弟類
    這樣,就不需要修改其它代碼,這就是接口編程的優(yōu)雅之處.
    另外的例子就是,在類的方法中,如下聲明:
    private void doMyAction(List list){}
    這樣這個方法能處理所有實現(xiàn)了List接口的類,一定程度上實現(xiàn)了泛型函數(shù).
    3.--------------------->
    如果開發(fā)的時候覺得ArrayList,HashMap的性能不能滿足你的需要,可以通過實現(xiàn)List,Map(或者Collection)來定制你的自定義類

    posted on 2012-03-20 21:40 paulwong 閱讀(1439) 評論(0)  編輯  收藏 所屬分類: J2SE

    主站蜘蛛池模板: 亚洲一区免费在线观看| 亚洲网站在线免费观看| 免费a在线观看播放| 亚洲区精品久久一区二区三区| 久久成人免费播放网站| 国产成人亚洲精品狼色在线| 黄色片网站在线免费观看| 日韩精品免费电影| 亚洲人成网站在线在线观看| 国产h视频在线观看免费| 亚洲精品资源在线| 精品成人免费自拍视频| 亚洲熟妇无码八AV在线播放| 一级看片免费视频| 亚洲国产一级在线观看| 美女羞羞免费视频网站| 国产zzjjzzjj视频全免费| 亚洲爆乳精品无码一区二区| 女人被男人桶得好爽免费视频| 亚洲视频无码高清在线| 老司机在线免费视频| 亚洲一区动漫卡通在线播放| 美女视频黄的全免费视频网站| 亚洲视频免费观看| 24小时在线免费视频| 亚洲欧洲日产专区| 日韩在线免费视频| 国产日本亚洲一区二区三区| 在线天堂免费观看.WWW| 亚洲AV成人噜噜无码网站| 免费精品人在线二线三线区别| 色偷偷女男人的天堂亚洲网| 免费A级毛片无码免费视| 中文字幕乱码亚洲无线三区| 女性自慰aⅴ片高清免费| 亚洲国产精品无码久久| 免费在线观看视频a| 一个人看的免费高清视频日本| 亚洲伊人久久大香线蕉综合图片| 日韩免费高清播放器| 亚洲午夜未满十八勿入|