黃小二的讀書(shū)筆記
有才而性緩定屬大才,有智而氣和斯為大智。人偏狹我受之以寬容,人險(xiǎn)仄我持之以坦蕩。緩事宜急干,敏則有功;急事宜緩辦,忙則多措。 --李叔同
首頁(yè)
新隨筆
聚合
管理
隨筆-7 評(píng)論-24 文章-102 trackbacks-0
[轉(zhuǎn)] java的 Collection 和 Map 詳解
原文轉(zhuǎn)自:
http://www.diybl.com/course/3_program/java/javajs/2007917/71621.html
前言
線性表,鏈表,哈希表是常用的數(shù)據(jù)結(jié)構(gòu),在進(jìn)行Java開(kāi)發(fā)時(shí),JDK已經(jīng)為我們提供了一系列相應(yīng)的類來(lái)實(shí)現(xiàn)基本的數(shù)據(jù)結(jié)構(gòu)。這些類均在java.util包中。本文試圖通過(guò)簡(jiǎn)單的描述,向讀者闡述各個(gè)類的作用以及如何正確使用這些類。
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
Collection接口
Collection是最基本的集合接口,一個(gè)Collection代表一組Object,即Collection的元素(Elements)。一些Collection允許相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接繼承自Collection的類,Java SDK提供的類都是繼承自Collection的“子接口”如List和Set。
所有實(shí)現(xiàn)Collection接口的類都必須提供兩個(gè)標(biāo)準(zhǔn)的構(gòu)造函數(shù):無(wú)參數(shù)的構(gòu)造函數(shù)用于創(chuàng)建一個(gè)空的Collection,有一個(gè)Collection參數(shù)的構(gòu)造函數(shù)用于創(chuàng)建一個(gè)新的Collection,這個(gè)新的Collection與傳入的Collection有相同的元素。后一個(gè)構(gòu)造函數(shù)允許用戶復(fù)制一個(gè)Collection。
如何遍歷Collection中的每一個(gè)元素?不論Collection的實(shí)際類型如何,它都支持一個(gè)iterator()的方法,該方法返回一個(gè)迭代子,使用該迭代子即可逐一訪問(wèn)Collection中每一個(gè)元素。典型的用法如下:
Iterator it = collection.iterator(); // 獲得一個(gè)迭代子
while(it.hasNext()) {
Object obj = it.next(); // 得到下一個(gè)元素
}
由Collection接口派生的兩個(gè)接口是List和Set。
List接口
List接口
List是有序的Collection,使用此接口能夠精確的控制每個(gè)元素插入的位置。用戶能夠使用索引(元素在List中的位置,類似于數(shù)組下標(biāo))來(lái)訪問(wèn)List中的元素,這類似于Java的數(shù)組。和下面要提到的Set不同,List允許有相同的元素。
除了具有Collection接口必備的iterator()方法外,List還提供一個(gè)listIterator()方法,返回一個(gè)ListIterator接口,和標(biāo)準(zhǔn)的Iterator接口相比,ListIterator多了一些add()之類的方法,允許添加,刪除,設(shè)定元素,還能向前或向后遍歷。
實(shí)現(xiàn)List接口的常用類有LinkedList,ArrayList,Vector和Stack。
LinkedList類
LinkedList類
LinkedList實(shí)現(xiàn)了List接口,允許null元素。此外LinkedList提供額外的get,remove,insert方法在LinkedList的首部或尾部。這些操作使LinkedList可被用作堆棧(stack),隊(duì)列(queue)或雙向隊(duì)列(deque)。
注意LinkedList沒(méi)有同步方法。如果多個(gè)線程同時(shí)訪問(wèn)一個(gè)List,則必須自己實(shí)現(xiàn)訪問(wèn)同步。一種解決方法是在創(chuàng)建List時(shí)構(gòu)造一個(gè)同步的List:
List list
=
Collections.synchronizedList(
new
LinkedList(
));
Vector類
Vector類
Vector非常類似ArrayList,但是Vector是同步的。由Vector創(chuàng)建的Iterator,雖然和ArrayList創(chuàng)建的Iterator是同一接口,但是,因?yàn)閂ector是同步的,當(dāng)一個(gè)Iterator被創(chuàng)建而且正在被使用,另一個(gè)線程改變了Vector的狀態(tài)(例如,添加或刪除了一些元素),這時(shí)調(diào)用Iterator的方法時(shí)將拋出ConcurrentModificationException,因此必須捕獲該異常。
Stack 類
Stack 類
Stack繼承自Vector,實(shí)現(xiàn)一個(gè)后進(jìn)先出的堆棧。Stack提供5個(gè)額外的方法使得Vector得以被當(dāng)作堆棧使用。基本的push和pop方法,還有peek方法得到棧頂?shù)脑兀琫mpty方法測(cè)試堆棧是否為空,search方法檢測(cè)一個(gè)元素在堆棧中的位置。Stack剛創(chuàng)建后是空棧。
Set接口
Set接口
Set是一種不包含重復(fù)的元素的Collection,即任意的兩個(gè)元素e1和e2都有e1.equals(e2)
=
false
,Set最多有一個(gè)null元素。
很明顯,Set的構(gòu)造函數(shù)有一個(gè)約束條件,傳入的Collection參數(shù)不能包含重復(fù)的元素。
請(qǐng)注意:必須小心操作可變對(duì)象(Mutable Object)。如果一個(gè)Set中的可變?cè)馗淖兞俗陨頎顟B(tài)導(dǎo)致Object.equals(Object)
=
true將導(dǎo)致一些問(wèn)題。
ArrayList類
ArrayList類
ArrayList實(shí)現(xiàn)了可變大小的數(shù)組。它允許所有元素,包括null。ArrayList沒(méi)有同步。size,isEmpty,get,set方法運(yùn)行時(shí)間為常數(shù)。但是add方法開(kāi)銷為分?jǐn)偟某?shù),添加n個(gè)元素需要O(n)的時(shí)間。其他的方法運(yùn)行時(shí)間為線性。
每個(gè)ArrayList實(shí)例都有一個(gè)容量(Capacity),即用于存儲(chǔ)元素的數(shù)組的大小。這個(gè)容量可隨著不斷添加新元素而自動(dòng)增加,但是增長(zhǎng)算法并沒(méi)有定義。當(dāng)需要插入大量元素時(shí),在插入前可以調(diào)用ensureCapacity方法來(lái)增加ArrayList的容量以提高插入效率。
和LinkedList一樣,ArrayList也是非同步的(unsynchronized)。
Map接口
請(qǐng)注意,Map沒(méi)有繼承Collection接口,Map提供key到value的映射。一個(gè)Map中不能包含相同的key,每個(gè)key只能映射一個(gè)value。Map接口提供3種集合的視圖,Map的內(nèi)容可以被當(dāng)作一組key集合,一組value集合,或者一組key-value映射。
Hashtable類
Hashtable類
Hashtable繼承Map接口,實(shí)現(xiàn)一個(gè)key
-
value映射的哈希表。任何非空(non
-
null
)的對(duì)象都可作為key或者value。
添加數(shù)據(jù)使用put(key, value),取出數(shù)據(jù)使用get(key),這兩個(gè)基本操作的時(shí)間開(kāi)銷為常數(shù)。Hashtable通過(guò)initial capacity和load factor兩個(gè)參數(shù)調(diào)整性能。通常缺省的load factor
0
.75較好地實(shí)現(xiàn)了時(shí)間和空間的均衡。增大load factor可以節(jié)省空間但相應(yīng)的查找時(shí)間將增大,這會(huì)影響像get和put這樣的操作。使用Hashtable的簡(jiǎn)單示例如下,將1,
2
,3放到Hashtable中,他們的key分別是”one”,”two”,”three”:
Hashtable numbers
=
new
Hashtable();
numbers.put(“one”,
new
Integer(
1
));
numbers.put(“two”,
new
Integer(
2
));
numbers.put(“three”,
new
Integer(
3
));
要取出一個(gè)數(shù),比如2,用相應(yīng)的key:
Integer n
=
(Integer)numbers.get(“two”);
System.out.println(“two
=
”
+
n);
由于作為key的對(duì)象將通過(guò)計(jì)算其散列函數(shù)來(lái)確定與之對(duì)應(yīng)的value的位置,因此任何作為key的對(duì)象都必須實(shí)現(xiàn)hashCode和equals方法。hashCode和equals方法繼承自根類Object,如果你用自定義的類當(dāng)作key的話,要相當(dāng)小心,按照散列函數(shù)的定義,如果兩個(gè)對(duì)象相同,即obj1.equals(obj2)
=
true
,則它們的hashCode必須相同,但如果兩個(gè)對(duì)象不同,則它們的hashCode不一定不同,如果兩個(gè)不同對(duì)象的hashCode相同,這種現(xiàn)象稱為沖突,沖突會(huì)導(dǎo)致操作哈希表的時(shí)間開(kāi)銷增大,所以盡量定義好的hashCode()方法,能加快哈希表的操作。
如果相同的對(duì)象有不同的hashCode,對(duì)哈希表的操作會(huì)出現(xiàn)意想不到的結(jié)果(期待的get方法返回null),要避免這種問(wèn)題,只需要牢記一條:要同時(shí)復(fù)寫(xiě)equals方法和hashCode方法,而不要只寫(xiě)其中一個(gè)。
Hashtable是同步的。
HashMap類
HashMap類
HashMap和Hashtable類似,不同之處在于HashMap是非同步的,并且允許null,即null value和null key。但是將HashMap視為Collection時(shí)(values()方法可返回Collection),其迭代子操作時(shí)間開(kāi)銷和HashMap的容量成比例。因此,如果迭代操作的性能相當(dāng)重要的話,不要將HashMap的初始化容量設(shè)得過(guò)高,或者load factor過(guò)低。
WeakHashMap類
WeakHashMap類
WeakHashMap是一種改進(jìn)的HashMap,它對(duì)key實(shí)行“弱引用”,如果一個(gè)key不再被外部所引用,那么該key可以被GC回收。
總結(jié)
如果涉及到堆棧,隊(duì)列等操作,應(yīng)該考慮用List,對(duì)于需要快速插入,刪除元素,應(yīng)該使用LinkedList,如果需要快速隨機(jī)訪問(wèn)元素,應(yīng)該使用ArrayList。
posted on 2008-09-04 15:06
黃小二
閱讀(245)
評(píng)論(0)
編輯
收藏
所屬分類:
J2SE
新用戶注冊(cè)
刷新評(píng)論列表
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問(wèn)
相關(guān)文章:
使用 dom4j 解析 XML
Struts2 讀書(shū)筆記(一) 前言、安裝、配置
'Hibernate 完全手冊(cè)' 讀書(shū)筆記(五) 事務(wù)和并發(fā)、緩存、高級(jí)特性、附錄
'Hibernate 完全手冊(cè)' 讀書(shū)筆記(四) 查詢語(yǔ)言
'Hibernate 完全手冊(cè)' 讀書(shū)筆記(三) 映射、操作對(duì)象
'Hibernate 完全手冊(cè)' 讀書(shū)筆記(二) 初識(shí)、體系、對(duì)象標(biāo)識(shí)符、配置、映射類型
'Hibernate 完全手冊(cè)' 讀書(shū)筆記(一) 對(duì)象持久化基礎(chǔ)
正則表達(dá)式相關(guān)(增加收集中...)
JAVA 中各種數(shù)據(jù)庫(kù)連接方式(補(bǔ)齊中)
Java程序設(shè)計(jì)語(yǔ)言(第4版) 筆記
<
2025年5月
>
日
一
二
三
四
五
六
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
文章分類
(147)
[DB](5)
[DB].MySQL(7)
[DB].Oracle(14)
[DB].SQL Server(8)
Ajax(13)
ASP.NET(18)
C#(19)
J2EE(22)
J2SE(12)
S/S2SH(15)
Web Design(8)
雜談(6)
文章檔案
(108)
2010年6月 (1)
2010年5月 (12)
2010年4月 (18)
2009年9月 (3)
2009年8月 (2)
2009年7月 (6)
2009年6月 (3)
2009年5月 (7)
2009年4月 (10)
2009年3月 (1)
2009年1月 (1)
2008年12月 (4)
2008年11月 (1)
2008年10月 (17)
2008年9月 (17)
2008年8月 (2)
2008年7月 (3)
在線幫助
Java API Specifications
Java 開(kāi)源大全
javaNB 在線文檔
MSDN 技術(shù)資源庫(kù)
MySQL 5.1參考手冊(cè)
Oracle Documentation
w3school 在線教程
開(kāi)源軟件庫(kù)
Ajax/JavaScript腳本大全
Asp.net源碼專業(yè)站
CSDN開(kāi)源頻道
CSS9.NET
源碼愛(ài)好者
社區(qū)
developerWorks 中國(guó)
最新評(píng)論
1.?re: SQL Server 2005/2008 對(duì)With Encryption選項(xiàng)創(chuàng)建的存儲(chǔ)過(guò)程解密
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--專業(yè)祛痘
2.?re: SQL Server 2005/2008 對(duì)With Encryption選項(xiàng)創(chuàng)建的存儲(chǔ)過(guò)程解密
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--lolola
3.?re: 在 WinForm中使用 WebClient上傳文件
44444444444444444444444
--熱熱
4.?re: 使用 HibernateTemplate 實(shí)現(xiàn)分頁(yè)查詢 (HibernateCallback接口)
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--redcoatjk
5.?re: SQL Server 2005/2008 對(duì)With Encryption選項(xiàng)創(chuàng)建的存儲(chǔ)過(guò)程解密
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--謝謝樓主
評(píng)論排行榜
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 黃小二
主站蜘蛛池模板:
亚洲精品偷拍视频免费观看
|
国产免费久久精品丫丫
|
成人毛片18岁女人毛片免费看
|
亚洲av无码专区在线
|
国产乱子伦精品免费女
|
中文无码日韩欧免费视频
|
久久久久亚洲精品无码蜜桃
|
女人18毛片免费观看
|
中文字幕看片在线a免费
|
337P日本欧洲亚洲大胆艺术图
|
国产偷国产偷亚洲清高动态图
|
日本免费xxxx色视频
|
亚洲AV无码AV吞精久久
|
亚洲人成图片小说网站
|
在线天堂免费观看.WWW
|
毛片基地看看成人免费
|
色吊丝免费观看网站
|
亚洲欧洲日产专区
|
亚洲伊人成无码综合网
|
亚洲精品乱码久久久久久蜜桃不卡
|
日本免费人成在线网站
|
日韩精品极品视频在线观看免费
|
色噜噜噜噜亚洲第一
|
亚洲乱码av中文一区二区
|
亚洲成色在线综合网站
|
日本久久久免费高清
|
一级毛片不卡片免费观看
|
国产亚洲精品成人久久网站
|
久久亚洲精品无码AV红樱桃
|
亚洲av永久无码精品漫画
|
无码专区一va亚洲v专区在线
|
中文字幕第一页亚洲
|
日韩精品无码区免费专区
|
免费无码av片在线观看
|
亚洲第一区在线观看
|
无人影院手机版在线观看免费
|
日韩精品亚洲人成在线观看
|
亚洲国产成人久久综合一
|
国产免费一区二区三区免费视频
|
一级**爱片免费视频
|
亚洲精品国产国语
|