日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

java hashset 源码_Java集合源码分析-HashSet和LinkedHashSet

發布時間:2025/3/20 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java hashset 源码_Java集合源码分析-HashSet和LinkedHashSet 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前兩篇文章分別分析了Java的ArrayList和LinkedList實現原理,這篇文章分析下HashSet和LinkedHashSet的源碼。重點講解HashSet,因為LinkedHashSet是繼承自HashSet,只是它的成員變量map類型是LinkedHashMap而不是HashMap。

HashSet和LinkedHashSet只能使用Iterator進行遍歷(解釋下foreach底層實現也是基于Iterator),而在Java的java.util包下的集合框架中,所有的Iterator遍歷都是fail-fast的,java.util.concurrent包下的集合框架中,所有的Iterator遍歷都是fail-safe的。

HashSet類圖

HashSet類圖

HashSet只有兩個成員變量:map: HashMap和PRESENT: Object,所以操作函數都是通過map實現的,PRESENT: Object是指map所有key的value都是PRESENT: Object。

HashSet實現Set接口,是一個不包含重復元素的一個無序的集合,允許使用null,最多允許一個元素為null。

HashSet也是一個非同步的方法,如果要在多個線程中使用,要注意進行同步封裝!

Set s = Collections.synchronizedSet(new HashSet(...));

HashSet構造器

HashSet的構造器比較多,共提供了5個:

public HashSet() {

map = new HashMap<>();

}

public HashSet(Collection extends E> c) {

map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));

addAll(c);

}

public HashSet(int initialCapacity, float loadFactor) {

map = new HashMap<>(initialCapacity, loadFactor);

}

public HashSet(int initialCapacity) {

map = new HashMap<>(initialCapacity);

}

HashSet(int initialCapacity, float loadFactor, boolean dummy) {

map = new LinkedHashMap<>(initialCapacity, loadFactor);

}

請注意第5個構造器,它的第三個參數表示是LinkedHashSet調用的,那么將map的類型改為LinkedHashMap。

HashSet核心操作

HashSet核心操作包括:

size():int

add(E):boolean

remove(o:Object):boolean

contains(o:Object):boolean

iterator():Iterator

clone():Object

size():int

public int size() {

return map.size();

}

add(E):boolean

public boolean add(E e) {

return map.put(e, PRESENT)==null;

}

其實調用的是HashMap的put方法。

remove(o:Object):boolean

public boolean remove(Object o) {

return map.remove(o)==PRESENT;

}

其實調用的是HashMap的remove方法。

contains(o:Object):boolean

public boolean contains(Object o) {

return map.containsKey(o);

}

其實調用的是HashMap的contains方法。

iterator():Iterator

public Iterator iterator() {

return map.keySet().iterator();

}

可以看出,HashSet的迭代器就是HashMap的key的迭代器,而且跟ArrayList和LinkedList一樣是fail-fast的。

clone():Object

public Object clone() {

try {

HashSet newSet = (HashSet) super.clone();

newSet.map = (HashMap) map.clone();

return newSet;

} catch (CloneNotSupportedException e) {

throw new InternalError(e);

}

}

克隆出一個新的HashSet,注意是淺拷貝。

LinkedHashSet

LinkedHashSet繼承自HashSet,源碼更少、更簡單,唯一的區別是LinkedHashSet內部使用的是LinkHashMap。這樣做的意義或者好處就是LinkedHashSet中的元素順序是可以保證的,也就是說遍歷序和插入序是一致的。

總結

以上是生活随笔為你收集整理的java hashset 源码_Java集合源码分析-HashSet和LinkedHashSet的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。