HashSet原始碼探討(基於JDK1.8)
阿新 • • 發佈:2019-01-07
HashSet 簡介
如果對HashMap沒有了解,應該先學習HashMap再學習HashSet 。
HashSet結構 同一個物件。
HashSet不保證元素的順序,而且HashSet允許使用 null 元素。
HashSet是非同步的,這也意味著HashSet是執行緒不安全的。如果多個執行緒同時訪問一個HashSet,而其中至少一個執行緒修改了該HashSet,那麼它必須保持外部同步。這通常是通過對自然封裝該 HashSet的物件執行同步操作來完成的。如果不存在這樣的物件,則應該使用 Collections.synchronizedSet 方法來“包裝” Set。最好在建立時完成這一操作,以防止對該 set 進行意外的不同步訪問:
HashSet結構
publicclassHashSet<E>
extendsAbstractSet<E>
implementsSet<E>,Cloneable, java.io.Serializable
private static final Object PRESENT = new Object();
publicboolean add(E e){
return map.put(e, PRESENT)==null;
}
HashSet不保證元素的順序,而且HashSet允許使用 null 元素。
HashSet是非同步的,這也意味著HashSet是執行緒不安全的。如果多個執行緒同時訪問一個HashSet,而其中至少一個執行緒修改了該HashSet,那麼它必須保持外部同步。這通常是通過對自然封裝該 HashSet的物件執行同步操作來完成的。如果不存在這樣的物件,則應該使用 Collections.synchronizedSet 方法來“包裝” Set。最好在建立時完成這一操作,以防止對該 set 進行意外的不同步訪問:
publicstatic<T>Set<T> synchronizedSet(Set<T> s){
returnnewSynchronizedSet<>(s);
}
staticclassSynchronizedSet<E>
extendsSynchronizedCollection<E>
implementsSet<E>{
privatestaticfinallong serialVersionUID =487447009682186044L;
SynchronizedSet
super(s);
}
SynchronizedSet(Set<E> s,Object mutex){
super(s, mutex);
}
publicboolean equals(Object o){
if(this== o)
returntrue;
synchronized(mutex){return c.equals(o);}
}
publicint hashCode(){
synchronized(mutex){return c.hashCode();}
}
}
publicclassHashSetIteratorTest{
privatestaticfinalint ADD_NUM =100000;
publicstaticvoid main(String[] args){
HashSet set =newHashSet();
for(int i=0; i<ADD_NUM; i++)
set.add(""+i);
// 通過Iterator遍歷HashSet
iteratorHashSet(set);
// 通過for-each遍歷HashSet
foreachHashSet(set);
}
privatestaticvoid iteratorHashSet(HashSet set){
long start =System.currentTimeMillis();
for(Iterator iterator = set.iterator();
iterator.hasNext();){
System.out.print(iterator.next());
}
System.out.println();
long end =System.currentTimeMillis();
System.out.println("iteratorHashSet: "+(end-start));
}
privatestaticvoid foreachHashSet(HashSet set){
long start =System.currentTimeMillis();
String[] arr =(String[])set.toArray(newString[0]);
for(String str:arr)
System.out.print(str);
long end =System.currentTimeMillis();
System.out.println();
System.out.println("foreachHashSet: "+(end-start));
}
}
iteratorHashSet:467
foreachHashSet:403