Java集合 List、Set、Map UML類圖關係

對Java中的集合類數據結構種類繁多,且他們之間的關係錯綜複雜, 於是對着JDK的源碼,用UML圖描述一下Java中各種List、Set和Map之間的關係。

對於類圖的表示,下面這這個圖展示了UML中、接口、繼承、組合、聚合、依賴、關聯之間的關係。

下面是List、Set和Map的UML類圖關係

可以簡單的總結一下:

ArrayList, LinkedList和Vector都是List的子類, 他們都是有序的,這個有序指的是按照寫入和讀出順序一致,這個需要和排序區分開來。

ArrayList和Vector底層實現都是數組,因此隨機訪問速度快,刪除慢。 而LinkedList是一個雙向鏈表,插入刪除都快,可以用作做FIFO隊列或者Stack。

而右邊Set系列,數據是無序的,因爲讀取順序和寫入順序沒有關係。但LinkedHashSet是有序的,因爲它的底層數據結構在Hashtable的基礎上增加了鏈表來記錄寫入順序。 同時對Set而言,裏面的元素不會重複,而且最多允許一個null元素。 TreeSet是紅黑樹的Set集,講真,這個紅黑樹我沒有搞清楚,只知道這個東西能排序,而且是平衡二叉樹,查找速度賊快。

對於Map系列,HashMap和Hashtable最常用, Hashtable 是將數組&鏈表完美結合起來的數據結構, 外層數據結構是Entry數組,Entry內部有個指針(引用)指向下一個Entry,這樣就形成一個鏈表。Hashtable中元素在數組的位置是計算出來的:計算器key的Hash值,然後與數組長度取餘獲得在數組位置,如果此位置已經有Entry(hash值相同),那麼就直接插入在這數組位置,並讓Entry的next指向之前的數組位置的Entry。 Hashtable和HashMap的最大差別是Hashtable是線程安全的。

LinkedHashMap就是在HashMap基礎上加入鏈表記錄寫入順序以便可以按順序讀出。

對於這些數據結構,除了Vector、Hashtable是線程安全的,其他的都是非線程安全,如果需要同等類型的線程安全數據結構,可以使用Collections這個Util類中的相關方法創建對應的數據結構。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章