第十一章、持有對象
Java容器架構圖:
11.1 迭代器(Iterator)
Iterator迭代器:使得客戶端程序員不必知道或關心容器類的底層結構。
ListIterator:只能用於各種List類容器的訪問。ListIterator可以雙向移動,而Iteraotr只能向前移動。
11.2 List
ArrayList&LinkedList:都可自動擴容。
ArrayList:底層是數組結構,即連續存儲空間,因可自動擴容,所以可以把ArrayList當作“可自動擴充自身尺寸的數組”看待。
優點:隨機讀取元素快; 缺點:在列表中間插入&刪除數據慢;
LinkedList:是鏈表結構。
優點:在列表中間插入&刪除數據快;缺點:隨機讀取元素慢(鏈表結構特徵,需要指針遍歷);
SparseList:Android提供的容器,優點:
CopeOnArrayList: 支持併發,用於多線程機制。
11.2.1 Stack(LIFO)
LinkdedList:具有能夠直接實現棧(Stack)的所有功能的方法,因此可以直接將LinkedList作為棧使用。
11.2.2 Queue(FIFO)
LinkdedList:也提供了支持隊列(Queue)行為的方法,並且實現了Queue接口,所以也可以用作Queue。
PriorityQueue:Java SE1.5新增容器,支持先彈出優先級高的元素(可實現Comparator接口)。
11.3 Set
不保存重複元素,包含下列容器:
HashSet:使用散列函數? 優點:可快速查找元素(WHY??:)
TreeSet:元素存儲在紅-黑樹中
LinkedHashSet:散列+鏈表 優點:快速查找+ 插入|刪除 元素 場景下的效率。
EnumSet:Java SE1.5新增容器,可以直接從Enum創建Set。
CopeOnWriteArraySet: 支持併發,用於多線程機制。
11.4 Map
K-V映射表,將對象映射到其他對象的能力是一種解決編程問題的殺手鐧。
HashMap:優點:快速訪問元素
TreeMap: 優點:保持“Key”排序(??)
LinkedHashMap:散列(快速訪問元素)+鏈表(插入|刪除元素性能優)
EnumMap:
ConcurrentHashMap:支持併發,支持多線程場景;
WeakHashMap:弱引用的持有對象,利於GC回收,避免內存洩露?
11.5 Collection 和 Iterator
Collection:在Java中,Collection是描述所有序列容器的共性的根接口,它可能會被認為是一個“附屬接口”,即因為要表示其他若干個接口的共性而出現的接口。而在標準C++類庫中並沒有其容器的任何公共基類。
Iterator:容器之間的所有共性都是通過迭代器達成的。Java將兩種方法綁定到了一起,因為實現Collection就意味著需要提供iterator()方法。
11.5.1 Foreach與迭代器
foreach語法用於任何實現了Iterable接口的類。
Collection接口擴展了Iterable接口,所以所有Collection對象都適用foreach語法。
11.5.2 選擇策略
a. Java容器:建議針對Collection接口編程,可for-each;
b. 自定義容器:建議實現Iterator,可實現迭代(若自行實現Collection,邏輯較複雜 )。
11.6 容器的元素類型(支持泛型)
11.6.1 支持泛型
a. 容器&持有對象的類型之前解耦,可支持任意類型的數據。
b. 類型編譯期檢測:有了泛型,容器就可以指定並檢查它們所持有對象的類型;
11.6.2 持有基本數據類型(自動裝箱&拆箱機制)
a. 在Java中,任何基本類型都不能作為類型參數。因此不能創建ArrayList
b. 自動裝箱&拆箱機制,實現可以持有基本數據類型:利用自動包裝機制和基本類型的包裝器來解決,自動包裝機制將自動地實現int 到 Integer的雙向轉換,
11.7 過時容器(廢棄)
Vector /HashTable / Stack : (WHY?? 已有替代的容器)
閱讀更多 編程家園 的文章