JDK的Set源码分析
导读:本文共2196.5字符,通常情况下阅读需要7分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 首先,我们看一下HashSetprivatetransientHashMap<E,Object>map;//DummyvaluetoassociatewithanObjectinthebackingMapprivatestaticfinalObjectPRESENT=newObject();可见,他适配了HashMap,那么他的功能是如何委托给Has... ...
首先,我们看一下HashSet
privatetransientHashMap<E,Object>map;
//DummyvaluetoassociatewithanObjectinthebackingMap
privatestaticfinalObjectPRESENT=newObject();
可见,他适配了HashMap,那么他的功能是如何委托给HashMap结构的呢?
publicbooleanadd(Ee){
returnmap.put(e,PRESENT)==null;
}
在hashMap中,我们大多数时候是用value,但是在set的时候,却很好的利用了已有类HashMap,他利用了HashMap的key的唯一性来保证存储在Set中的元素的唯一性;
privatestaticfinalObjectPRESENT=newObject();
是这个HashMap所有key的value,他只是一个形式,而我们真正的数据是存在在key中的资源;
我们最后拿到的迭代器也是:
publicIterator<E>iterator(){
returnmap.keySet().iterator();
}
map的keySet的迭代器;
同理,我们看看LinkedhashMap;
publicLinkedHashSet(intinitialCapacity,floatloadFactor){
super(initialCapacity,loadFactor,true);
}
/**
*Constructsanew,emptylinkedhashsetwiththespecifiedinitial
*capacityandthedefaultloadfactor(0.75).
*
*@paraminitialCapacitytheinitialcapacityoftheLinkedHashSet
*@throwsIllegalArgumentExceptioniftheinitialcapacityisless
*thanzero
*/
publicLinkedHashSet(intinitialCapacity){
super(initialCapacity,.75f,true);
}
/**
*Constructsanew,emptylinkedhashsetwiththedefaultinitial
*capacity(16)andloadfactor(0.75).
*/
publicLinkedHashSet(){
super(16,.75f,true);
}
调用了父类的构造函数;构造函数如下:
HashSet(intinitialCapacity,floatloadFactor,booleandummy){
map=newLinkedHashMap<E,Object>(initialCapacity,loadFactor);
}
生出了LinkedHashMap;
同理,我们一样可见到treeMap的实现:
privatetransientNavigableMap<E,Object>m;
//DummyvaluetoassociatewithanObjectinthebackingMap
privatestaticfinalObjectPRESENT=newObject();
JDK的Set源码分析的详细内容,希望对您有所帮助,信息来源于网络。