JAVA容器
JAVA容器大致包括兩大陣營:Collection和Map。
先來看一下Collection。
1. Collection
Collection首先實現了叠代器Iterator,這樣所有Collection的子類都可以使用Iterator進行遍歷。
2. List,ArrayList,LinkedList
List,有序可尋址容器
ArrayList,基於數組實現,存儲空間連續,尋址容易,但是執行刪除和插入困難。
LinkedList,實現了Deque和List兩個接口,基於鏈表實現,特點是尋址困難,但是執行插入和刪除操作容易。
3. Vector和Stack
Vector和Stack是古老的容器,不建議使用,如果需要用到棧,可以用ArrayDeque替代。
4. Set,TreeSet,HashSet,LinkedHashSet
Set是無序的不能尋址的容器,且裏面沒有重復項。
TreeSet,將元素按照紅黑樹存儲,能夠對元素進行排序。
HashSet,根據哈希算法尋址存儲元素,後面會詳細介紹。
LinkedHashSet,使用鏈表來維護元素的次序,元素看起來像按元素插入的順序來訪問集合裏的元素。插入性能略低於HashSet,但是利用叠代遍歷全部元素時,性能優於HashSet。
4. Queue,PriorityQueue,Deque,ArrayDeque
Queue,先入先出的容器。
PriorityQueue,違背了先入先出的原則,會對元素按照大小重排,先輸出最小的元素。
Deque,雙向隊列,可以從隊首和隊尾插入元素。
ArrayDeque,可以用來替代Stack。
關於Map我們用到的主要如圖中所示:
1. HashMap,LinkedHashMap
通過Key的HashCode計算存儲位置
LinkedHashMap能夠保證插入順序和叠代順序一致
2. TreeMap
能夠保證所有的key-value處於有序的狀態
操作集合的工具類:Collections
包括排序操作,查找替換操作,同步控制,設置不可變集合(只讀版本的集合)
同步控制可以將指定集合包裝成線程同步的集合,將線程不安全變為線程安全。
推薦閱讀博文 http://www.cnblogs.com/LipeiNet/p/5888513.html
HashSet和HashMap的深入討論
HashCode
equals
有時候需要重寫equals和HashCode,原則是保證當兩個對象通過equals返回true時,也需要兩個對象的hashCode方法返回相等的值。
因為當多個元素的hashCode相同但是equals方法返回false時,就需要在一個桶裏放多個元素,這樣會導致性能下降。
順便討論一下==和equals
兩個引用類型變量,只有當他們指向同一個對象時,==判斷才會返回true。
Object提供了equals的實現,和==相同。String重寫了這個方法用來比較字符串相同。
JAVA容器