java容器类3:set/HastSet/MapSet深入解读
介紹
Set:集合,是一個不包含重復數據的集合。(A collection that contains no duplicate elements. )
set中最多包含一個null元素,否者包含了兩個相同的元素,不符合定義。
上一篇學習了Java中的容器類的一些基礎接口,以及Collection接口三大分支中的List分支(ArrayList以及LinkedList)。這一篇文章將講解Collection三大分支(List、Set、Queue)中的Set分支,以及衍生出來的子類。
java容器類分析:Collection,List,ArrayList,LinkedList深入解讀
Set接口的總的集成關系如下圖:
Set接口
public interface Set<E> extends Collection<E>
查看Set的源碼可以發現,Set中的接口函數和Collection完全相同,并沒有添加任何新的接口。只是子類在實現這些接口的時候需要考慮,Set中不能有重復的元素這一原則。接口中的函數及描述可查看上一篇博客。
AbstractSet抽象類
和AbstractList及AbstractCollection的作用相似,AbstractSet類作為一個抽象類,實現了Set接口中的部分函數,減少后續Set子類的實現工作。
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E>
具體該抽象類實現了Set中的如下幾個接口: public boolean equals(Object o) {if (o == this)return true;if (!(o instanceof Set))return false;Collection<?> c = (Collection<?>) o;if (c.size() != size())return false;try {return containsAll(c);
} catch (ClassCastException unused) {return false;} catch (NullPointerException unused) {return false;}}hashCode():Set的hash值等于將Set中所有元素的hash值相加,這就保證了if(set1.equals(set2)) 那么set1.hashCode()== set2.hashCode()。
public int hashCode() {int h = 0;Iterator<E> i = iterator();while (i.hasNext()) {E obj = i.next();if (obj != null)h += obj.hashCode();}return h;}removeAll(): 移除c與當前Set的交集,返回值代表是否有元素從當前Set中移除,交集為空返回false否則返回true。
public boolean removeAll(Collection<?> c) {Objects.requireNonNull(c);boolean modified = false;if (size() > c.size()) {for (Iterator<?> i = c.iterator(); i.hasNext(); )modified |= remove(i.next());} else {for (Iterator<?> i = iterator(); i.hasNext(); ) {if (c.contains(i.next())) {i.remove();modified = true;}}}return modified;}?
SortedSet
public interface SortedSet<E> extends Set<E>
public interface SortedSet<E> extends Set<E> {//經過某種排序的set JDK1.7 java.util Comparator<? super E> comparator();//返回對此 set中的元素進行排序的比較器 SortedSet<E> subSet(E fromElement, E toElement);//返回此 set的部分視圖,其元素從 fromElement(包括)到 toElement(不包括)。( SortedSet<E> headSet(E toElement);//返回此 set 的部分視圖,其元素嚴格小于 toElement SortedSet<E> tailSet(E fromElement);//返回此 set的部分視圖,其元素大于等于 fromElement E first();//set中第一個元素 E last();//set中最后一個元素 }NavigableSet
public interface NavigableSet<E> extends SortedSet<E> {//擴展的 SortedSet,具有了搜索匹配元素方法 JDK1.7 java.util E lower(E e);//返回此 set中小于給定元素的最大元素 E floor(E e);//返回此 set中小于等于給定元素的最大元素 E ceiling(E e);//返回此 set中大于等于給定元素的最小元素 E higher(E e);//返回此 set中大于給定元素的最小元素 E pollFirst();//獲取并移除第一個元素 E pollLast();//獲取并移除最后一個元素 Iterator<E> iterator();//以升序返回在此set的元素上進行迭代的迭代器 NavigableSet<E> descendingSet();//返回此 set中所包含元素的逆序視圖 Iterator<E> descendingIterator();//以降序返回在此 set的元素上進行迭代的迭代器。效果等同于 descendingSet().iterator()。 //返回此 set 的部分視圖,其元素范圍從 fromElement 到 toElement NavigableSet<E> subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive);//返回此 set的部分視圖,其元素小于(或等于,如果 inclusive 為 true)toElement NavigableSet<E> headSet(E toElement, boolean inclusive);//返回此 set的部分視圖,其元素大于(或等于,如果 inclusive 為 true)fromElement NavigableSet<E> tailSet(E fromElement, boolean inclusive);//返回此 set 的部分視圖,其元素從 fromElement(包括)到 toElement(不包括)。 SortedSet<E> subSet(E fromElement, E toElement);//返回此 set的部分視圖,其元素嚴格小于 toElement SortedSet<E> headSet(E toElement);//返回此 set的部分視圖,其元素大于等于 fromElement SortedSet<E> tailSet(E fromElement); }HashSet
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable
閱讀HashSet的源碼,其實很簡單,就是在里面維護了一個 HashMap類型的成員變量,然后抽象出了幾個增刪改查的方法。需要深入了解的話可以閱讀:java容器類2:Map及HashMap深入解讀
這里有個疑問,HashMap是存放鍵值對的,而HashSet是存放一組數據的,為什么可以用HashMap保存set數據?
HashMap中的keySet()函數返回的就是一個 Set類型的數據(不能有重復的key值),所以HashSet將Set數組全部存放在HashMap的keySet中,value值全部用默認的一個Object類型的常量表示。
HashSet中的add()函數可以看出
public boolean add(E e) {return map.put(e, PRESENT)==null;}TreeSet
TreeSet的繼承關系如下,看上去還挺復雜
正如TreeSet繼承自SortSet一樣,TreeSet中存儲了排序的數組(每個元素值不能有重復的元素)。
同HashSet實現方法相同,里面維護了一個map(NavigableMap類型)類型的成員變量,來保證所有數據是有序的。map里面的keySet字段可以保存TreeSet的所有值。
TreeSet中的方法都是基于NavigableMap的增刪改查操作,這里不詳細分析。
?
參考:
http://www.cnblogs.com/NeilZhang/p/8577991.html
夢想不是浮躁,而是沉淀和積累
總結
以上是生活随笔為你收集整理的java容器类3:set/HastSet/MapSet深入解读的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么申请万元以上的信用卡
- 下一篇: 浦发腾讯动漫联名信用卡申请条件