黃小二的讀書筆記
有才而性緩定屬大才,有智而氣和斯為大智。人偏狹我受之以寬容,人險仄我持之以坦蕩。緩事宜急干,敏則有功;急事宜緩辦,忙則多措。 --李叔同
首頁
新隨筆
聚合
管理
隨筆-7 評論-24 文章-102 trackbacks-0
[轉] java的 Collection 和 Map 詳解
原文轉自:
http://www.diybl.com/course/3_program/java/javajs/2007917/71621.html
前言
線性表,鏈表,哈希表是常用的數據結構,在進行Java開發時,JDK已經為我們提供了一系列相應的類來實現基本的數據結構。這些類均在java.util包中。本文試圖通過簡單的描述,向讀者闡述各個類的作用以及如何正確使用這些類。
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
Collection接口
Collection是最基本的集合接口,一個Collection代表一組Object,即Collection的元素(Elements)。一些Collection允許相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接繼承自Collection的類,Java SDK提供的類都是繼承自Collection的“子接口”如List和Set。
所有實現Collection接口的類都必須提供兩個標準的構造函數:無參數的構造函數用于創建一個空的Collection,有一個Collection參數的構造函數用于創建一個新的Collection,這個新的Collection與傳入的Collection有相同的元素。后一個構造函數允許用戶復制一個Collection。
如何遍歷Collection中的每一個元素?不論Collection的實際類型如何,它都支持一個iterator()的方法,該方法返回一個迭代子,使用該迭代子即可逐一訪問Collection中每一個元素。典型的用法如下:
Iterator it = collection.iterator(); // 獲得一個迭代子
while(it.hasNext()) {
Object obj = it.next(); // 得到下一個元素
}
由Collection接口派生的兩個接口是List和Set。
List接口
List接口
List是有序的Collection,使用此接口能夠精確的控制每個元素插入的位置。用戶能夠使用索引(元素在List中的位置,類似于數組下標)來訪問List中的元素,這類似于Java的數組。和下面要提到的Set不同,List允許有相同的元素。
除了具有Collection接口必備的iterator()方法外,List還提供一個listIterator()方法,返回一個ListIterator接口,和標準的Iterator接口相比,ListIterator多了一些add()之類的方法,允許添加,刪除,設定元素,還能向前或向后遍歷。
實現List接口的常用類有LinkedList,ArrayList,Vector和Stack。
LinkedList類
LinkedList類
LinkedList實現了List接口,允許null元素。此外LinkedList提供額外的get,remove,insert方法在LinkedList的首部或尾部。這些操作使LinkedList可被用作堆棧(stack),隊列(queue)或雙向隊列(deque)。
注意LinkedList沒有同步方法。如果多個線程同時訪問一個List,則必須自己實現訪問同步。一種解決方法是在創建List時構造一個同步的List:
List list
=
Collections.synchronizedList(
new
LinkedList(
));
Vector類
Vector類
Vector非常類似ArrayList,但是Vector是同步的。由Vector創建的Iterator,雖然和ArrayList創建的Iterator是同一接口,但是,因為Vector是同步的,當一個Iterator被創建而且正在被使用,另一個線程改變了Vector的狀態(例如,添加或刪除了一些元素),這時調用Iterator的方法時將拋出ConcurrentModificationException,因此必須捕獲該異常。
Stack 類
Stack 類
Stack繼承自Vector,實現一個后進先出的堆棧。Stack提供5個額外的方法使得Vector得以被當作堆棧使用。基本的push和pop方法,還有peek方法得到棧頂的元素,empty方法測試堆棧是否為空,search方法檢測一個元素在堆棧中的位置。Stack剛創建后是空棧。
Set接口
Set接口
Set是一種不包含重復的元素的Collection,即任意的兩個元素e1和e2都有e1.equals(e2)
=
false
,Set最多有一個null元素。
很明顯,Set的構造函數有一個約束條件,傳入的Collection參數不能包含重復的元素。
請注意:必須小心操作可變對象(Mutable Object)。如果一個Set中的可變元素改變了自身狀態導致Object.equals(Object)
=
true將導致一些問題。
ArrayList類
ArrayList類
ArrayList實現了可變大小的數組。它允許所有元素,包括null。ArrayList沒有同步。size,isEmpty,get,set方法運行時間為常數。但是add方法開銷為分攤的常數,添加n個元素需要O(n)的時間。其他的方法運行時間為線性。
每個ArrayList實例都有一個容量(Capacity),即用于存儲元素的數組的大小。這個容量可隨著不斷添加新元素而自動增加,但是增長算法并沒有定義。當需要插入大量元素時,在插入前可以調用ensureCapacity方法來增加ArrayList的容量以提高插入效率。
和LinkedList一樣,ArrayList也是非同步的(unsynchronized)。
Map接口
請注意,Map沒有繼承Collection接口,Map提供key到value的映射。一個Map中不能包含相同的key,每個key只能映射一個value。Map接口提供3種集合的視圖,Map的內容可以被當作一組key集合,一組value集合,或者一組key-value映射。
Hashtable類
Hashtable類
Hashtable繼承Map接口,實現一個key
-
value映射的哈希表。任何非空(non
-
null
)的對象都可作為key或者value。
添加數據使用put(key, value),取出數據使用get(key),這兩個基本操作的時間開銷為常數。Hashtable通過initial capacity和load factor兩個參數調整性能。通常缺省的load factor
0
.75較好地實現了時間和空間的均衡。增大load factor可以節省空間但相應的查找時間將增大,這會影響像get和put這樣的操作。使用Hashtable的簡單示例如下,將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
));
要取出一個數,比如2,用相應的key:
Integer n
=
(Integer)numbers.get(“two”);
System.out.println(“two
=
”
+
n);
由于作為key的對象將通過計算其散列函數來確定與之對應的value的位置,因此任何作為key的對象都必須實現hashCode和equals方法。hashCode和equals方法繼承自根類Object,如果你用自定義的類當作key的話,要相當小心,按照散列函數的定義,如果兩個對象相同,即obj1.equals(obj2)
=
true
,則它們的hashCode必須相同,但如果兩個對象不同,則它們的hashCode不一定不同,如果兩個不同對象的hashCode相同,這種現象稱為沖突,沖突會導致操作哈希表的時間開銷增大,所以盡量定義好的hashCode()方法,能加快哈希表的操作。
如果相同的對象有不同的hashCode,對哈希表的操作會出現意想不到的結果(期待的get方法返回null),要避免這種問題,只需要牢記一條:要同時復寫equals方法和hashCode方法,而不要只寫其中一個。
Hashtable是同步的。
HashMap類
HashMap類
HashMap和Hashtable類似,不同之處在于HashMap是非同步的,并且允許null,即null value和null key。但是將HashMap視為Collection時(values()方法可返回Collection),其迭代子操作時間開銷和HashMap的容量成比例。因此,如果迭代操作的性能相當重要的話,不要將HashMap的初始化容量設得過高,或者load factor過低。
WeakHashMap類
WeakHashMap類
WeakHashMap是一種改進的HashMap,它對key實行“弱引用”,如果一個key不再被外部所引用,那么該key可以被GC回收。
總結
如果涉及到堆棧,隊列等操作,應該考慮用List,對于需要快速插入,刪除元素,應該使用LinkedList,如果需要快速隨機訪問元素,應該使用ArrayList。
posted on 2008-09-04 15:06
黃小二
閱讀(255)
評論(0)
編輯
收藏
所屬分類:
J2SE
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
使用 dom4j 解析 XML
Struts2 讀書筆記(一) 前言、安裝、配置
'Hibernate 完全手冊' 讀書筆記(五) 事務和并發、緩存、高級特性、附錄
'Hibernate 完全手冊' 讀書筆記(四) 查詢語言
'Hibernate 完全手冊' 讀書筆記(三) 映射、操作對象
'Hibernate 完全手冊' 讀書筆記(二) 初識、體系、對象標識符、配置、映射類型
'Hibernate 完全手冊' 讀書筆記(一) 對象持久化基礎
正則表達式相關(增加收集中...)
JAVA 中各種數據庫連接方式(補齊中)
Java程序設計語言(第4版) 筆記
<
2025年7月
>
日
一
二
三
四
五
六
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
8
9
文章分類
(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 開源大全
javaNB 在線文檔
MSDN 技術資源庫
MySQL 5.1參考手冊
Oracle Documentation
w3school 在線教程
開源軟件庫
Ajax/JavaScript腳本大全
Asp.net源碼專業站
CSDN開源頻道
CSS9.NET
源碼愛好者
社區
developerWorks 中國
最新評論
1.?re: SQL Server 2005/2008 對With Encryption選項創建的存儲過程解密
評論內容較長,點擊標題查看
--專業祛痘
2.?re: SQL Server 2005/2008 對With Encryption選項創建的存儲過程解密
評論內容較長,點擊標題查看
--lolola
3.?re: 在 WinForm中使用 WebClient上傳文件
44444444444444444444444
--熱熱
4.?re: 使用 HibernateTemplate 實現分頁查詢 (HibernateCallback接口)
評論內容較長,點擊標題查看
--redcoatjk
5.?re: SQL Server 2005/2008 對With Encryption選項創建的存儲過程解密
評論內容較長,點擊標題查看
--謝謝樓主
評論排行榜
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 黃小二
主站蜘蛛池模板:
亚洲经典在线观看
|
久久久亚洲欧洲日产国码农村
|
67194在线午夜亚洲
|
99在线观看免费视频
|
亚洲视频中文字幕
|
67194国产精品免费观看
|
亚洲精品动漫在线
|
h视频在线免费看
|
亚洲综合无码一区二区痴汉
|
免费羞羞视频网站
|
美女黄色免费网站
|
精品亚洲一区二区三区在线播放
|
ssswww日本免费网站片
|
亚洲AV无码久久精品狠狠爱浪潮
|
99热在线观看免费
|
亚洲天堂免费在线
|
亚洲国产香蕉人人爽成AV片久久
|
国产精品视_精品国产免费
|
久久久久久久久无码精品亚洲日韩
|
亚洲Av永久无码精品黑人
|
啦啦啦完整版免费视频在线观看
|
亚洲午夜未满十八勿入网站2
|
99精品视频免费
|
久久久久亚洲Av无码专
|
免费A级毛片无码免费视
|
曰批全过程免费视频观看免费软件
|
日本免费人成黄页在线观看视频
|
婷婷久久久亚洲欧洲日产国码AV
|
特级毛片A级毛片免费播放
|
亚洲精品人成无码中文毛片
|
久久久受www免费人成
|
久久久久亚洲Av片无码v
|
亚洲三级高清免费
|
特黄aa级毛片免费视频播放
|
亚洲精品制服丝袜四区
|
国产在线观看免费观看不卡
|
国产精品免费无遮挡无码永久视频
|
亚洲色图黄色小说
|
四虎永久在线精品免费影视
|
花蝴蝶免费视频在线观看高清版
|
欧美激情综合亚洲一二区
|