天天看點

java中Map、List與Set比較

     java中集合包括三大類,它們分别是Map、List和Map。我們為什麼要設定不同的集合類型,是為了放置不同的資料,而且不同類型用在不同的場合。這三個類放在何處呢,它們放在java.util包中,Set、List和Map都是接口,它們有各自的實作類。Set的主要實作類:HashSet和TreeSet,List的主要實作類是ArrayList,而Map主要實作類是HashMap和TreeMap。

 Set集合:

      繼承于Collection接口。類似一個罐子,把一個對象添加到set集合時,Set集合無法确定添加的順序,故Set集合中要求不能添加重複的資料(否則系統将無法準确找到該元素)。

      HashSet:是Set集合接口的典型的實作,我們通常都會使用這個實作類,HashSet接口按照Hash算法來進行查找和存取,具有很好的效率,它具有以下特點:

      特點:

          1、不能保證元素按順序排列

          2、HashSet不是同步的,如果多個線程通路同一個HashSet,如果多個線程同時修改HashSet的

             值,必須程式員去保證同步。

          3、集合元素值可以是null

     TreeSet:實作SortedSet,顧名思義TreeSet可以保證元素處于排序狀态,采用紅黑樹算法來存儲集合元素。(紅黑樹算法是一種二叉查找樹) TreeSet除了具有HashSet具有的方法外,還提供了排序的方法--Comparator()來實作對集合中元素進行排序。TreeSet預設支援兩種排序方法:自然排序和定制排序。自然排序會調用集合中比較方法--compareTo(Object obj)方法比較元素之間的大小關系,然後将集合按照升序排列。而定制排序其實就是可以實作自己私人定制,我們可以根據自己的需要來進行降序排列。

    上面是兩個主要應用的Set集合的實作類,HashSet還有一個子類:LinkedHashSet,它也是根據元素的HashCode來查找元素的存儲位置,但它使用連結清單來維護元素的次序,由于連結清單的連結作用,這樣當我們從集合中查找資料時,看起來是按照插入的順序來儲存的,也就是說我們需要周遊整個集合時,會按照添加的順序來通路集合中元素。

    Set實作類的比較

      1、HashSet性能高于TreeSet(特别在添加、查找元素操作時),因為TreeSet需要額外的算法來維護次序

      2、對于普通的插入、删除HashSet高于LinkedHashSet,這是由于維護連結清單需要額外的開銷,但正是因為有了連結清單,使得LinkedHashSet周遊速度要快于HashSet

      3、HashSet、TreeSet和LinkedSet都是線程不安全的