1.Iterable
是java頂級接口之一,Collection
接口繼承Iterable
,所以Collection
的所有子類也實現了Iterable
接口。
允許對象成爲 "foreach" 語句的目標。一個Iterable接口類可以使用foreach循環,例如
public static void main(String[] args) {
ArrayList<String> arr = new ArrayList<String>();
for(String str : arr){
System.out.println(str);
}
}
他只有一個方法:
/**
* Returns an iterator over a set of elements of type T.
*
* @return an Iterator.
*/
Iterator<T> iterator();
返回一個在一組 T 類型的元素上進行迭代的迭代器。2.Collectins接口
是層次結構中的根接口,Collection所代表的是一種規則它所包含的元素都必須遵循一條或者多條規則。如有些允許重複而有些則不能重複、有些必須要按照順序插入而有些則是散列有些支持排序但是有些則不支持。如:List、Set。
主要方法:
a.add()確保此 collection 包含指定的元素(可選操作)。
b.contains()如果此 collection 包含指定的元素,則返回 true。
c.remove() 從此 collection 中移除指定元素的單個實例,如果存在的話(可選操作)。
3.List接口
List是Collection的直接子接口,提供有序的集合即它用某種特定的插入順序來維護元素順序。用戶可以對列表中每個元素的插入位置進行精確地控制,同時可以根據元素的整數索引(在列表中的位置)訪問元素,並搜索列表中的元素。實現List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。
其主要實現類:
a)ArrayList類
ArrayList是一個動態的數組,也是最常用的數組,它允許符合規則的任何元素插入包括null,提供3個構造函數,默認構造長度爲10的數組,也可構造一個包含指定 collection 的元素的列表,隨着容器中元素的增加,數組的長度也會隨之增加。每次添加新元素都會檢查容器長度,當快要溢出時,則進行擴容。
ArrayList擅長於隨機訪問,且是線程不安全。
b)LinkedList類
Linked是一個雙向鏈表結構,由於是雙向鏈表結構,LinkedList額外提供了列表開頭和結尾get、remove 和 insert 元素,由此這些操作允許將鏈接列表用作堆棧、隊列或者雙端隊列。
和ArrayList的結構一樣,也是非同步的,多線程操作需要加上同步操作。
c) Vector
Vector和ArrayList一樣也是一個動態數據,提供指定容量增量的的構造函數,其他操作和ArrayList一致,不同的是Vector的方法都是同步方法,所以是多線程安全數組。
d)Stack
Stack表示一個後進先出的(LIFO)對象堆棧,數據結構與Vector基本一致,對Vector 進行了擴展 ,允許將向量視爲堆棧。它提供了通常的 push 和 pop 操作,以及取堆棧頂點的 peek 方法、測試堆棧是否爲空的 empty 方法、在堆棧中查找項並確定到堆棧頂距離的 search 方法。
首次創建堆棧時,它不包含項。
4.Set接口
一個不包含重複元素的 collection。更確切地講,set 不包含滿足 e1.equals(e2)
的元素對 e1
和 e2
,並且最多包含一個 null 元素。正如其名稱所暗示的,此接口模仿了數學上的 set 抽象。實現了Set接口的集合有:EnumSet、HashSet、TreeSet。
a)HashSet
此類實現 Set 接口,由哈希表(實際上是一個 HashMap 實例)支持。它不保證 set 的迭代順序;特別是它不保證該順序恆久不變。此類允許使用 null 元素。
b)TreeSet
基於 TreeMap
的 NavigableSet
實現。使用元素的自然順序對元素進行排序,或者根據創建 set 時提供的 Comparator
進行排序,具體取決於使用的構造方法。
c)EnumSet
是枚舉的專用Set。所有的元素都是枚舉類型。
5.Map
將鍵映射到值的對象。一個映射不能包含重複的鍵;每個鍵最多隻能映射到一個值。保證了鍵值的一一對應關係,實現map的有:HashMap、TreeMap、HashTable、Properties、EnumMap。
a) HashMap
基於哈希表的 Map 接口的實現。此實現提供所有可選的映射操作,並允許使用 null 值和 null 鍵。(除了非同步和允許使用 null 之外,HashMap 類與 Hashtable 大致相同。)此類不保證映射的順序,特別是它不保證該順序恆久不變。
HashMap是基於數組及鏈表的結構,通過Key的hashCode映射到數組位置,再判斷該位置是否存在數據,在驗證是否有相同的key值存在,在此基礎上添加。
b) TreeMap
基於紅黑樹(Red-Black tree)的 NavigableMap
實現。該映射根據其鍵的自然順序進行排序,或者根據創建映射時提供的 Comparator
進行排序,具體取決於使用的構造方法。
此實現不是同步的。如果多個線程同時訪問一個映射,並且其中至少一個線程從結構上修改了該映射,則其必須 外部同步。
c) HashTable
與HashMap結構相同,不同是隻允許非空的鍵值,且是線程安全,效率低於HashMap。
6.Queue
隊列,它主要分爲兩大類,一類是阻塞式隊列,隊列滿了以後再插入元素則會拋出異常,主要包括ArrayBlockQueue、PriorityBlockingQueue、LinkedBlockingQueue。另一種隊列則是雙端隊列,支持在頭、尾兩端插入和移除元素,主要包括:ArrayDeque、LinkedBlockingDeque、LinkedList。
7.異同點
a)ArrayList、Vector
相同點:
1)都是動態數組,支持動態擴容,都支持隨機訪問
2)Vector和ArrayList的數據結構都相同,在查找指定位置的數據時間複雜度是相同的,但在刪除、移動指針位置就需要所有元素移動,相比之下LinkedList鏈表的結構效率更高。
不同點:
1)Vector方法都是同步方法,是線程安全的,而ArrayList是不同步的方法,所以在多線程開發需要考慮線程安全。
2)如果集合中的元素的數據大於目前集合數組的長度時,Vector的增長率是目前數組長度的100%,ArrayList增長率是目前數組長度的50%,如在集合中使用數據量比較大的數據。Vector有一定的優勢。
b)ArrayList、LinkedList
不同點:
1)ArrayList是基於動態數組的結構,LinkedList是基於雙向鏈表的結構
2)對於隨機訪問get set,ArrayList的效率會更高,因爲LInkedList需要指針查找。
3)對於新增刪除,LinkedList更佔優勢,ArrayList需要移動數據。
兩者都是非線程安全,需要主動進行同步操作,實際應用情況,當數據量少的時候新增刪除ArrayList與LinkedList的效率差不多,涉及到大批量的數據新增修改LinkedList的效率會明顯高於ArrayList。
c)HashMap、HashTable
1)Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現
2)同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的
3)HashMap可以讓你將空值作爲一個表的條目的key或value 。
d)TreeMap、HashMap
1)HashMap通過hashcode對其內容進行快速查找,而TreeMap中所有的元素都保持着某種固定的順序,如果你需要得到一個有序的結果你就應該使用TreeMap(HashMap中元素的排列順序是不固定的)。HashMap中元素的排列順序是不固定的)。
2) HashMap通過hashcode對其內容進行快速查找,而TreeMap中所有的元素都保持着某種固定的順序,如果你需要得到一個有序的結果你就應該使用TreeMap(HashMap中元素的排列順序是不固定的)。集合框架”提供兩種常規的Map實現:HashMap和TreeMap (TreeMap實現SortedMap接口)。
3) 在Map 中插入、刪除和定位元素,HashMap 是最好的選擇。但如果您要按自然順序或自定義順序遍歷鍵,那麼TreeMap會更好。使用HashMap要求添加的鍵類明確定義了hashCode()和 equals()的實現。 這個TreeMap沒有調優選項,因爲該樹總處於平衡狀態。