目錄
第十一章 持有對象
第十七章 容器深入研究
第十八章 Java I/O系統
1. java容器概覽
java容器的兩種主要類型(它們之間的主要區別在於容器中每個“槽”保存的元素個數):Collection和Map。
(1)Collection是一個獨立元素的序列,這些元素都服從一條或者多條規則。Collection概括了序列的概念——一種存放一組對象的方式。
(2)Map是一組成對的“鍵值對”對象,允許使用鍵來查找值。
2. 相關工具類java.util.Arrays類和java.util.Collections類。
(1)添加一組元素
Arrays.asList();
Collections.asList();
(2)容器的打印
Arrays.toString();
3. 迭代器
遍歷容器而不關心容器的具體類型。迭代器也是一種設計模式。(和C++中的迭代器類似)
Collection接口有一個iterator()方法返回一個Iterator對象,也就是說每個繼承自Collection的容器都可以迭代(Collection接口繼承自Iterable接口)。Iterator有如下方法:
boolean hasNext() :如果仍有元素可以迭代,則返回 true。
E next() :返回迭代的下一個元素。
void remove() :從迭代器指向的 collection 中移除迭代器返回的最後一個元素(可選操作,不是所有的容器都實現了該方法)。
4. ListIterator
ListIterator繼承自Iterator。Iterator只能向前移動,但是ListIterator可以雙向移動,ListIterator只能用於各種List。
5. Set
將兩個相同的對象放入Set中是不行的。Set是基於對象的值來確定歸屬性的。
HashSet:基於hash函數;TreeSet:基於紅黑樹;LinkedHashSet:hash函數+鏈表。
TreeSet 使用元素的自然順序對元素進行排序,或者根據創建 set 時提供的 Comparator 進行排序,具體取決於使用的構造方法。
String類有一個比較器String.CASE_INSENSITIVE_ORDER;
6. PriorityQueue
一個基於優先級堆的無界優先級隊列。優先級隊列的元素按照其自然順序進行排序,或者根據構造隊列時提供的 Comparator 進行排序,具體取決於所使用的構造方法。
7. 簡單的容器分類
1. 完整的容器分類法
下圖展示了Java容器類庫的完備圖,包括抽象類和遺留構件(不包括Queue的實現)。
常用的容器用黑色粗線框表示,點線框表示接口,虛線框表示抽象類,實線框表示類,空心箭頭表示實現關系。Produce表示任意的Map對象可以生成Collection對象,任意的Collection對象可以生成Iterator對象。
2. 容器總結
下面以表格的形式總結List、Set、Map接口及各實現類的特性:
特性
實現類
實現類特性
對放置的元素的要求
List
線性、有序的存儲容器,可通過索引訪問元素get(n)
ArrayList
數組實現。非同步。
Vector
類似ArrayList,同步。
LinkedList
雙向鏈表。非同步。
Set
元素不能重復,元素必須定義equals()方法
HashSet
為快速查找設計的Set
元素必須定義hashCode()
TreeSet
保持次序的Set,底層為樹結構
元素必須實現Comparable接口
LinkedHashSet
內部使用鏈表維護元素的順序(插入的次序)
元素必須定義hashCode()
Map
保存鍵值對成員,Map中的所有鍵必須定義equals()方法
HashMap
基於哈希表的 Map 接口的實現,滿足通用需求
鍵必須有恰當的hashCode(),如果修改了equals方法,需同時修改hashCode方法
TreeMap
默認根據自然順序進行排序,或者根據創建映射時提供的 Comparator進行排序
鍵成員要求實現caparable接口,或者使用Comparator構造TreeMap。鍵成員一般為同一類型。
LinkedHashMap
類似於HashMap,但迭代遍歷時取得“鍵值對”的順序是其插入順序或者最近最少使用的次序
與HashMap相同
IdentityHashMap
使用==取代equals()對“鍵值”進行比較的散列映射
成員通過==判斷是否相等
WeakHashMap
弱鍵映射,允許釋放映射所指向的對象
ConcurrentHashMap
線程安全的Map