2.3 HashSet,LinkedHashSet,TreeSet

1、HashSetjava

private transient HashMap<E,Object> map; //map集合,HashSet存放元素的容器 private static final Object PRESENT = new Object(); //map,中鍵對應的value值
HashSet是Set接口的典型實現,HashSet按照Hash算法來存儲集合中的元素。存在如下特色:
  • 不能保證元素的順序,元素是無序的
  • HashSet不是同步的,須要外部保持線程之間的同步問題
  • 集合元素值容許爲null
 
PRESENT爲HashSet類中定義的一個使用static final 修飾的常量,並沒有實際的意義,HashSet的add方法調用HashMap的put()方法實現,若是鍵已經存在,map.put()放回的是舊值,添加失敗,若是添加成功map.put()方法返回的是null ,HashSet.add()方法返回true,要添加的元素可做爲map中的key 。
 
對於Hashset而言,它全部的key對應的值都是PRESENT。
 
  • HashSet的底層經過HashMap實現的。而HashMap在1.7以前使用的是數組+鏈表實現,在1.8+使用的數組+鏈表+紅黑樹實現。其實也能夠這樣理解,HashSet的底層實現和HashMap使用的是相同的方式,由於Map是無序的,所以HashSet也沒法保證順序。
  • HashSet的方法,也是藉助HashMap的方法來實現的。
 
2、LinkedHashSet 
LinkedHashSet是HashSet的子類。
相同點:
二者都不能保存重複的數據。
差別點:
一、HashSet不保證集合中元素的順序(由於用的HashMap保存數據),即不能保證迭代的順序與插入的順序一致。
二、LinkedHashSet按照元素插入的順序進行迭代(由於用的LinkedHashMap保存數據),即迭代輸出的順序與插入的順序保持一致
 
調用HashSet的構造器,map = new LinkedHashMap<>(initialCapacity, loadFactor);
 
全部操做基於map
例:add 內部爲map.add();
 
 
3、TreeSet
TreeSet的元素支持2種排序方式:天然排序或者根據提供的Comparator進行排序。
一、不能有重複的元素;
二、具備排序功能;
三、TreeSet中的元素必須實現Comparable接口並重寫compareTo()方法,TreeSet判斷元素是否重複 、以及肯定元素的順序 靠的都是這個方法;
①對於 Java類庫中定義的類,TreeSet能夠直接對其進行存儲,如String,Integer等,由於這些類已經實現了Comparable接口);
②對於自定義類,若是不作適當的處理,TreeSet中只能存儲一個該類型的對象實例,不然沒法判斷是否重複。
四、依賴TreeMap。
五、相對HashSet,TreeSet的優點是有序,劣勢是相對讀取慢。根據不一樣的場景選擇不一樣的集合。
相關文章
相關標籤/搜索