1. 程式人生 > >Java集合類List、Set、Queue、Map實現類

Java集合類List、Set、Queue、Map實現類

1.Collection

    Collection最基本的集合介面,一個Collection代表一組Object的集合

public interface Collection<E> extends Iterable<E> {

任何實現Collection介面的類,都必須實現iterator方法來提供遍歷集合中的元素

Iterator<T> iterator();

例如List中集合的遍歷可以採用如下方式

List<String> strings = Arrays.asList(array);
Iterator<String> iterator = strings.iterator();
while(iterator.hasNext()){ System.out.printf(iterator.next()); }

注意Collection和Collectors的區別,這個在面試的時候也是經常問到的問題,Collection是集合的介面,所有的集合類都實現該介面,Collectors是一個類,提供了sort方法對集合進行排序;簡單提一下Collectors.sort方法的使用:

1>.要排序的類實現Comparable介面,實現compareTo方法;然後使用Collerctors.sort(List<Object>)即可;

2>在排序的時候再去new一個Comparator,比如

Collections.sort(list,new Comparator<User>(){
            public int compare(User arg0, User arg1) {
                return arg0.getOrder().compareTo(arg1.getOrder());
            }
        });

1.1.Set

    Set繼承Collection介面,不能包含重複元素,Set判斷兩個物件不是使用==來判斷,是使用equals方法,新加入的元素會與已有的元素判斷equals比較返回false則加入,否則拒絕加入;所以使用Set的時候有兩點需要注意:1.放入的物件要實現equals方法;2.對set的建構函式中,傳入的Collection引數不能包含重複的元素。

 1.1.1HashSet

    HashSet實現了Set介面,由雜湊表提供支援,不保證Set的迭代順序;允許使用null值,同時不允許元素有重複,因為HashSet底層是使用HashMap來實現的,HashSet中的元素都存放在HashMap的key上面,value是一個統一的靜態變數;

    HashSet中新增元素呼叫add方法,然後會呼叫HashMap的put方法插入元素,HashMap的put方法插入元素時,會首先判斷是否存在key,如果不存在,則插入這個key-value,存在則修改value值;在set中,value值沒用,因此往HashSet中新增元素,首先判斷key是否存在,不存在插入元素,存在則不做處理;

    HashSet使用Hash演算法儲存集合中的元素,具有很好的查詢和存取效能。向HashSet中存入一個元素時,HashSet呼叫物件的HashCode方法獲取物件的HashCode值,根據HashCode值決定物件的儲存位置。HashSet判斷元素物件是否相同的方法是同時使用HashCode和equals方法來判斷,關於equals方法和HashCode的說明:

1>.equals相等的物件,hashCode一定相等;

2>.equals不相等的物件,hashCode可能相等,也可能相等。(雜湊生成的時候產生碰撞)

3>.反之,HashCode不相等,則equals方法一定不相等(如果equals相等則與規則1矛盾);

4>.HashCode相等,equals可以相等,也可以不相等。

    HashSet判斷元素相等方法時,首先判斷兩個物件的HashCode是否相等,如果不相等,則認為兩個物件也不相等,如果相等再判斷equals方法是否相等;如果hashCode相等,equals方法不相等,則認為時不同的物件;為什麼這樣做,主要是為了提高效率,HashCode的效率比equals效率更高,不必每次重新計算Hash值

1.1.1.1 linkedHashSet

    linkedHashSet繼承自HashSet,同時使用連結串列來維護元素的順序,元素以插入的順序進行訪問;在效能上略低於HashSet,但在迭代訪問時有很好的效能;

1.1.2 SortedSet

    主要用於排序操作,實現此介面的子類都屬於排序子類。

1.1.2.1 TreeSet

     基於SortedSet,底層實現是通過二叉樹,插入的元素要實現Comparable介面。

1.2  List

    List代表元素有序,可重複的集合,集合中每個元素都有對應的順序索引,允許加入重複元素,通過索引指定元素的位置,實現有ArrayList,Vector,Queue。

1.2.1 ArrayList

    ArrayList是基於陣列的實現,封裝了一個動態增長,允許再分配的Object[]陣列。

1.2.2 Vector
public class Vector<E>
    extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable

使用方法和ArrayList基本相同,子類有Stack,和ArrayList區別是Vector是執行緒安全的,對集合元素操作的時候都加了Synchronized,保證執行緒的安全;在擴容時,Vector預設增長一倍的容量,而List只增長50%;

1.2.2.1 Stack
class Stack<E> extends Vector<E> {

stack(棧)實現了Vector類,後進先出。

1.2.3  LinkedList
public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable

實現List介面,Deque介面;基於鏈式的儲存方式

1.3.Queue

    queue用於模擬佇列這種資料結構,先進先出。

2.Map

    map用於儲存對映關係的資料結構,java先是實現了Map資料結構,然後在這個基礎上進行包裝,key用來存放具體的值,value為null的map就實現了set的資料結構;

2.1 HashMap

    HashMap根據鍵的HashCode值儲存資料,具有很快的訪問速度,遍歷時,獲取的元素順序是隨機的;允許null key存在,不支援執行緒的同步,即同一時刻有多個執行緒寫map,可能導致最終資料不一致。如果需要同步可以用SynchroizedMap方法或者使用ConcurrentHashMap(基於ReentrantLock來實現的),HashMap的資料結構


紫色部分是hash陣列,陣列的每個元素時連結串列的頭節點,連結串列是用來解決hash衝突的,如果不同的key對映到同一個位置就將它放到連結串列中去。插入元素時,放在連結串列的頭節點。HashMap是無序的,元素遍歷的順序和插入的順序是不一致的,如果要一致可以使用下面的LinkedHashMap;

2.1.1 LinkedHashMap

    使用雙向連結串列來維護Map的key-value的順序,保持讀取順序和插入元素的順序一致。

2.2 HashTable

    在處理元素時使用Synchronize,所以它是執行緒安全的。

2.3 SortedMap
public interface SortedMap<K,V> extends Map<K,V> {

正如set派生出SortedSet一樣,Map也派生出SortedMap,實現排序功能,任何實現該介面的類必須實現排序介面。

Comparator<? super K> comparator();

實現類有TreeMap;

2.3.1 TreeMap

    TreeMap資料結構是紅黑樹,TreeMap儲存key-value時,根據key對節點進行排序,保證所有節點的有序狀態。