《JAVA編程思想》5分鐘速成:第11章(持有對象)

第十一章、持有對象

Java容器架構圖:

《JAVA編程思想》5分鐘速成:第11章(持有對象)

​​

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 或 HashMap之類的東西。

b. 自動裝箱&拆箱機制,實現可以持有基本數據類型:利用自動包裝機制和基本類型的包裝器來解決,自動包裝機制將自動地實現int 到 Integer的雙向轉換,


11.7 過時容器(廢棄)

Vector /HashTable / Stack : (WHY?? 已有替代的容器)


分享到:


相關文章: