版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第JavaLinkedHashMap深入分析源碼目錄一、LinkedHashMap的類繼承關(guān)系二、源碼分析1.自己對LinkedHashMap的理解2.如何做到雙向鏈的增刪改查(1).增(2).刪(3).改(4).查3.遍歷
一、LinkedHashMap的類繼承關(guān)系
二、源碼分析
1.自己對LinkedHashMap的理解
從繼承關(guān)系上,我們看到LinkedHashMap繼承了HashMap,它里面的增刪改差遍歷的邏輯都是使用的HashMap中的,但是LinkedHashMap比HashMap多了一個雙向鏈,這個雙向鏈?zhǔn)菑牡谝粋€插入的元素開始按照插入順序,連接起來,所以可以說LinkedHashMap是可以保證插入順序的。
看圖:這里就簡單的給大家看一下這個鏈?zhǔn)巧稑拥模划嫾t黑樹了
2.如何做到雙向鏈的增刪改查
(1).增
1).是在創(chuàng)建新節(jié)點的時候,把雙向鏈連接起來,注意有兩種節(jié)點一個是TreeNode一個普通Node
源碼:
NodeK,VnewNode(inthash,Kkey,Vvalue,NodeK,Ve){
LinkedHashMap.EntryK,Vp=
newLinkedHashMap.EntryK,V(hash,key,value,e);
linkNodeLast(p);
returnp;
TreeNodeK,VnewTreeNode(inthash,Kkey,Vvalue,NodeK,Vnext){
TreeNodeK,Vp=newTreeNodeK,V(hash,key,value,next);
linkNodeLast(p);
returnp;
privatevoidlinkNodeLast(LinkedHashMap.EntryK,Vp){
LinkedHashMap.EntryK,Vlast=tail;
tail=p;
if(last==null)
head=p;
else{
p.before=last;
last.after=p;
staticclassEntryK,VextendsHashMap.NodeK,V{
EntryK,Vbefore,after;
Entry(inthash,Kkey,Vvalue,NodeK,Vnext){
super(hash,key,value,next);
}
代碼太簡單了,這里簡單描述一下,就是添加新節(jié)點會創(chuàng)建Node,有兩種Node:TreeNode和普通Node(注意這里多態(tài)的使用普通Node和LinedHashMap.Entry和TreeNode的關(guān)系看一下就明白了),在創(chuàng)建之后放到雙向鏈最后面。
2).有好多人說了還有一個afterNodeInsertion方法,這個方法的名字就顯示是在插入之后調(diào)用的,是不是在這個方法中也有修改鏈表的邏輯,我們來看這個方法
voidafterNodeInsertion(booleanevict){//possiblyremoveeldest
LinkedHashMap.EntryK,Vfirst;
if(evict(first=head)!=nullremoveEldestEntry(first)){
Kkey=first.key;
removeNode(hash(key),key,null,false,true);
protectedbooleanremoveEldestEntry(Map.EntryK,Veldest){
returnfalse;
}
看這個判斷,有一個永遠(yuǎn)是false,也就是說如果我們不重寫這個removeEldestEntry方法,那這個afterNodeInsertion方法里的邏輯永遠(yuǎn)不會執(zhí)行,那這個玩意兒是干啥的呢,看邏輯是用來移除最早的頭節(jié)點的,不知道為啥寫著么一段,默認(rèn)不會執(zhí)行!!!
(2).刪
voidafterNodeRemoval(NodeK,Ve){//unlink
LinkedHashMap.EntryK,Vp=
(LinkedHashMap.EntryK,V)e,b=p.before,a=p.after;//b是當(dāng)前節(jié)點的前一個節(jié)點,a是后一個節(jié)點
p.before=p.after=null;//先斷開當(dāng)前節(jié)點,把當(dāng)前節(jié)點對上一個和下一個節(jié)點的引用置為空
if(b==null)//當(dāng)前節(jié)點的前一個節(jié)點是null,說明當(dāng)前節(jié)點是頭節(jié)點,那去掉當(dāng)前節(jié)點之后,當(dāng)前節(jié)點的后一個節(jié)點成為了鏈第一個,
//也就是頭節(jié)點,當(dāng)然有可能a也是null,那整個鏈就是空鏈,這種寫法兼容了a也是null的情況
head=a;
else
b.after=a;//如果當(dāng)前節(jié)點不是頭節(jié)點,直接去掉當(dāng)前節(jié)點,當(dāng)前節(jié)點的前一個和后一個連起來
if(a==null)//如果當(dāng)前節(jié)點的后一個節(jié)點是null,說明當(dāng)前節(jié)點是尾節(jié)點,那把當(dāng)前節(jié)點去掉后,當(dāng)前節(jié)點的前一個節(jié)點成為了鏈的最后一個節(jié)點尾節(jié)點。
tail=b;
else
a.before=b;//如果當(dāng)前節(jié)點不是尾節(jié)點,直接去掉當(dāng)前節(jié)點,當(dāng)前節(jié)點的前一個和后一個連起來
}
這個刪除我們看一下在哪里調(diào)用的:
finalNodeK,VremoveNode(inthash,Objectkey,Objectvalue,
booleanmatchValue,booleanmovable){
if(node!=null(!matchValue||(v=node.value)==value||
(value!=nullvalue.equals(v)))){
if(nodeinstanceofTreeNode)
((TreeNodeK,V)node).removeTreeNode(this,tab,movable);
elseif(node==p)
tab[index]=node.next;
else
p.next=node.next;
++modCount;
--size;
afterNodeRemoval(node);//??????
returnnode;
returnnull;
}
在HashMap的removeNode方法里,當(dāng)時學(xué)習(xí)HashMap的時候還是有疑惑的這個方法干啥使的,還是一個沒有方法體的空實現(xiàn)方法,現(xiàn)在明白了,就是在給子類重寫呢,所以說LinkedHashMap增刪改查基本上全是HashMap的邏輯。
(3).改
有幾點要注意
1).首先聲明一點afterNodeAccess這個方法雖然在HashMap中改變鍵值對value值的時候都會調(diào)用,但是它和改變值沒啥關(guān)系,真正的改值的邏輯是HashMap中的例如putVal方法,這個方法只是在改完值之后調(diào)用一下
finalVputVal(inthash,Kkey,Vvalue,booleanonlyIfAbsent,
booleanevict){
if(e!=null){//existingmappingforkey
VoldValue=e.value;
if(!onlyIfAbsent||oldValue==null)
e.value=value;
afterNodeAccess(e);//????????
returnoldValue;
++modCount;
if(++sizethreshold)
resize();
afterNodeInsertion(evict);
returnnull;
}
2).afterNodeAccess的真正作用是把剛剛訪問過的節(jié)點放到雙向鏈的末尾,一旦執(zhí)行這個方法那就會打亂我們由插入順序形成的鏈表,這個邏輯執(zhí)不執(zhí)行由accessOrder變量控制
/**
*此方法的作用是將剛剛訪問的節(jié)點e放到鏈表的尾端
voidafterNodeAccess(NodeK,Ve){
LinkedHashMap.EntryK,Vlast;
//accessOrder=true時訪問節(jié)點后才需要置于尾端
//如果e本身就在尾端,那就不需要操作
if(accessOrder(last=tail)!=e){
//記錄節(jié)點e、e的前驅(qū)、e的后繼
LinkedHashMap.EntryK,Vp=(LinkedHashMap.EntryK,V)e,b=p.before,a=p.after;
//第一步:現(xiàn)將p.after置空
p.after=null;
//第二步:將e的前驅(qū).after連接上e的后繼
if(b==null)
//b記錄e的前驅(qū),前驅(qū)為null,則e在表頭,head置為e的后繼
head=a;
else
//否則e的前驅(qū).after=e的后繼
b.after=a;
//第三步:將e的后繼.before連接上e的前驅(qū)
if(a!=null)
//e的后繼!=null,將e后繼.before=e的前驅(qū)
a.before=b;
else
//否則e的后繼==null,即在e表尾(這里有點多余,前面已經(jīng)判斷在表尾不操作。。。)
last=b;
//第四步:將節(jié)點e接入到鏈表的尾端
if(last==null)
//last==null,鏈表為空,head=p
head=p;
else{
//p.before指向last(鏈表尾端),尾端.after=p
p.before=last;
last.after=p;
//第四步:更新鏈表新尾端tail
tail=p;
//鏈表結(jié)構(gòu)性調(diào)整,修改次數(shù)自增
++modCount;
}
注意,到底會不會執(zhí)行這個方法,是由accessOrder變量控制,而這個變量只有在構(gòu)造方法中指定才會為ture,其他的構(gòu)造方法默認(rèn)都是false不執(zhí)行這段邏輯:
publicLinkedHashMap(intinitialCapacity,floatloadFactor){
super(initialCapacity,loadFactor);
accessOrder=false;
*Constructsanemptyinsertion-orderedttLinkedHashMap/ttinstance
*withthespecifiedinitialcapacityandadefaultloadfactor(0.75).
*@paraminitialCapacitytheinitialcapacity
*@throwsIllegalArgumentExceptioniftheinitialcapacityisnegative
publicLinkedHashMap(intinitialCapacity){
super(initialCapacity);
accessOrder=false;
*Constructsanemptyinsertion-orderedttLinkedHashMap/ttinstance
*withthedefaultinitialcapacity(16)andloadfactor(0.75).
publicLinkedHashMap(){
super();
accessOrder=false;
*Constructsaninsertion-orderedttLinkedHashMap/ttinstancewith
*thesamemappingsasthespecifiedmap.ThettLinkedHashMap/tt
*instanceiscreatedwithadefaultloadfactor(0.75)andaninitial
*capacitysufficienttoholdthemappingsinthespecifiedmap.
*@parammthemapwhosemappingsaretobeplacedinthismap
*@throwsNullPointerExceptionifthespecifiedmapisnull
publicLinkedHashMap(MapextendsK,extendsVm){
super();
accessOrder=false;
putMapEntries(m,false);
*ConstructsanemptyttLinkedHashMap/ttinstancewiththe
*specifiedinitialcapacity,loadfactorandorderingmode.
*@paraminitialCapacitytheinitialcapacity
*@paramloadFactortheloadfactor
*@paramaccessOrdertheorderingmode-tttrue/ttfor
*access-order,ttfalse/ttforinsertion-order
*@throwsIllegalArgumentExceptioniftheinitialcapacityisnegative
*ortheloadfactorisnonpositive
publicLinkedHashMap(intinitialCapacity,
floatloadFactor,
booleanaccessOrder){
super(initialCapacity,loadFactor);
this.accessOrder=accessOrder;
}
(4).查
publicVget(Objectkey){
NodeK,V
if((e=getNode(hash(key),key))==null)
returnnull;
if(accessOrder)
afterNodeAccess(e);
returne.value;
*{@inheritDoc}
publicVgetOrDefault(Objectkey,VdefaultValue){
NodeK,V
if((e=getNode(hash(key),key))==null)
returndefaultValue;
if(accessOrder)
afterNodeAccess(e);
returne.value;
}
沒啥好說的,都是調(diào)用的HashMap的代碼。
3.遍歷
遍歷和hashMap一樣,只不過重寫了一些方法,重寫是為了按插入順序遍歷
publicSetKkeySet(){
SetKks=keySet;
if(ks==null){
ks=newLinkedKeySet();
keySet=ks;
returnks;
finalclassLinkedKeySetextendsAbstractSetK{
publicfinalintsize(){returnsize;}
publicfinalvoidclear(){LinkedHashMap.this.clear();}
publicfinalIteratorKiterator(){
returnnewLinkedKeyIterator();
publicfinalbooleancontains(Objecto){returncontainsKey(o);}
publicfinalbooleanremove(Objectkey){
returnremoveNode(hash(key),key,null,false,true)!=null;
publicfinalSpliteratorKspliterator(){
returnSpliterators.spliterator(this,Spliterator.SIZED|
Spliterator.ORDERED|
Spliterator.DISTINCT);
publicfinalvoidforEach(ConsumersuperKaction){
if(action==null)
thrownewNullPointerException();
intmc=modCount;
for(LinkedHashMap.EntryK,Ve=head;e!=null;e=e.after)
action.accept(e.key);
if(modCount!=mc)
thrownewConcurrentModificationException();
publicCollectionVvalues(){
CollectionVvs=values;
if(vs==null){
vs=newLinkedValues();
values=vs;
returnvs;
finalclassLinkedValuesextendsAbstractCollectionV{
publicfinalintsize(){returnsize;}
publicfinalvoidclear(){LinkedHashMap.this.clear();}
publicfinalIteratorViterator(){
returnnewLinkedValueIterator();
publicfinalbooleancontains(Objecto){returncontainsValue(o);}
publicfinalSpliteratorVspliterator(){
returnSpliterators.spliterator(this,Spliterator.SIZED|
Spliterator.ORDERED);
publicfinalvoidforEach(ConsumersuperVaction){
if(action==null)
thrownewNullPointerException();
intmc=modCount;
for(LinkedHashMap.EntryK,Ve=head;e!=null;e=e.after)
action.accept(e.value);
if(modCount!=mc)
thrownewConcurrentModificationException();
*Returnsa{@linkSet}viewofthemappingscontainedinthismap.
*Thesetisbackedbythemap,sochangestothemapare
*reflectedintheset,andvice-versa.Ifthemapismodified
*whileaniterationoverthesetisinprogress(exceptthrough
*theiterator'sownttremove/ttoperation,orthroughthe
*ttsetValue/ttoperationonamapentryreturnedbythe
*iterator)theresultsoftheiterationareundefined.Theset
*supportselementremoval,whichremovesthecorresponding
*mappingfromthemap,viathettIterator.remove/tt,
*ttSet.remove/tt,ttremoveAll/tt,ttretainAll/ttand
*ttclear/ttoperations.Itdoesnotsupportthe
*ttadd/ttorttaddAll/ttoperations.
*Its{@linkSpliterator}typicallyprovidesfastersequential
*performancebutmuchpoorerparallelperformancethanthatof
*{@codeHashMap}.
*@returnasetviewofthemappingscontainedinthismap
publicSetMap.EntryK,VentrySet(){
SetMap.EntryK,Ves;
return(es=entrySet)==null(entrySet=newLinkedEntrySet()):es;
finalclassLinkedEntrySetextendsAbstractSetMap.EntryK,V{
publicfinalintsize(){returnsize;}
publicfinalvoidclear(){LinkedHashMap.this.clear();}
publicfinalIteratorMap.EntryK,Viterator(){
returnnewLinkedEntryIterator();
publicfinalbooleancontains(Objecto){
if(!(oinstanceofMap.Entry))
returnfalse;
Map.Entry,e=(Map.Entry,
Objectkey=e.getKey();
NodeK,Vcandidate=getNode(hash(key),key);
returncandidate!=nullcandidate.equals(e);
publicfinalbooleanremove(Objecto){
if(oinstanceofMap.Entry){
Map.Entry,e=(Map.Entry,
Objectkey=e.getKey();
Objectvalue=e.getValue();
returnremoveNode(hash(key),key,value,true,true)!=null;
returnfalse;
publicfinalSpliteratorMap.EntryK,Vspliterator(){
returnSpliterators.spliterator(this,Spliterator.SIZED|
Spliterator.ORDERED|
Spliterator.DISTINCT);
publicfinalvoidforEach(ConsumersuperMap.EntryK,Vaction){
if(action==null)
thrownewNullPointerException();
intmc=modCount;
for(LinkedHashMap.EntryK,Ve=head;e!=null;e=e.after)
action.accept(e);
if(modCount!=mc)
thrownewConcurrentModificationException();
//Mapoverrides
publicvoidforEach(BiConsumersuperK,superVaction){
if(action==null)
thrownewNullPointerException();
intmc=modCount;
for(LinkedHashMap.EntryK,Ve=head;e!=null;e=e.after)
action.accept(e.key,e.value);
if(modCount!=mc)
thrownewConcurrentModificationException();
publicvoidreplaceAll(BiFunctionsuperK,superV,extendsVfunction){
if(function==null)
thrownewNullPointerException();
intmc=modCount;
for(LinkedHashMap.EntryK,Ve=head;e!=null;e=e.after)
e.value=function.apply(e.key,e.value);
if(modCount!=mc)
thrownewConcurrentModificationException();
}
簡單測試一下,是不是按順序遍歷:
publicclassLinkedHashMapTestMain{
publicstaticvoidmain(String[]args){
LinkedHashMapString,StringlinkedHashMap=newLinkedHashMap();
for(inti=0;i100;i++){
linkedHashMap.put(i+"",i+"");
//第一種entrySet
SetMap.EntryString,StringentrySet=linkedHashMap.entrySet();
IteratorMap.EntryString,Stringiterator=entrySet.iterator();
while(iterator.hasNext()){
Map.EntryString,Stringentry=iterator.next();
System.out.println("entrySet:"+"key:"+entry.getKey()+"---value:"+entry.getValue());
for(Map.EntryString,Stringentry:entrySet){
System.out.println("entrySetforEach循環(huán):"+"key:"+entry.getKey()+"---value:"+entry.getValue());
//第二種keySet
SetStringkeySet=linkedHashMap.keySet();
IteratorStringkeySetIterator=keySet.iterator();
while(keySetIterator.hasNext()){
Stringkey=keySetIterator.next();
System.out.println("keySet:"+"key:"+key+"---value:"+linkedHashMap.get(key));
for(Stringkey:keySet){
System.out.println("keySetforEach循環(huán):"+"key:"+key+"---value:"+linkedHashMap.get(key));
}
執(zhí)行結(jié)果:
entrySet:key:0---value:0
entrySet:key:1---value:1
entrySet:key:2---value:2
entrySet:key:3---value:3
entrySet:key:4---value:4
entrySet:key:5---value:5
entrySet:key:6---value:6
entrySet:key:7---value:7
entrySet:key:8---value:8
entrySet:key:9---value:9
entrySet:key:10---value:10
entrySet:key:11---value:11
entrySet:key:12---value:12
entrySet:key:13---value:13
entrySet:key:14---value:14
entrySet:key:15---value:15
entrySet:key:16---value:16
entrySet:key:17---value:17
entrySet:key:18---value:18
entrySet:key:19---value:19
entrySet:key:20---value:20
entrySet:key:21---value:21
entrySet:key:22---value:22
entrySet:key:23---value:23
entrySet:key:24---value:24
entrySet:key:25---value:25
entrySet:key:26---value:26
entrySet:key:27---value:27
entrySet:key:28---value:28
entrySet:key:29---value:29
entrySet:key:30---value:30
entrySet:key:31---value:31
entrySet:key:32---value:32
entrySet:key:33---value:33
entrySet:key:34---value:34
entrySet:key:35---value:35
entrySet:key:36---value:36
entrySet:key:37---value:37
entrySet:key:38---value:38
entrySet:key:39---value:39
entrySet:key:40---value:40
entrySet:key:41---value:41
entrySet:key:42---value:42
entrySet:key:43---value:43
entrySet:key:44---value:44
entrySet:key:45---value:45
entrySet:key:46---value:46
entrySet:key:47---value:47
entrySet:key:48---value:48
entrySet:key:49---value:49
entrySet:key:50---value:50
entrySet:key:51---value:51
entrySet:key:52---value:52
entrySet:key:53---value:53
entrySet:key:54---value:54
entrySet:key:55---value:55
entrySet:key:56---value:56
entrySet:key:57---value:57
entrySet:key:58---value:58
entrySet:key:59---value:59
entrySet:key:60---value:60
entrySet:key:61---value:61
entrySet:key:62---value:62
entrySet:key:63---value:63
entrySet:key:64---value:64
entrySet:key:65---value:65
entrySet:key:66---value:66
entrySet:key:67---value:67
entrySet:key:68---value:68
entrySet:key:69---value:69
entrySet:key:70---value:70
entrySet:key:71---value:71
entrySet:key:72---value:72
entrySet:key:73---value:73
entrySet:key:74---value:74
entrySet:key:75---value:75
entrySet:key:76---value:76
entrySet:key:77---value:77
entrySet:key:78---value:78
entrySet:key:79---value:79
entrySet:key:80---value:80
entrySet:key:81---value:81
entrySet:key:82---value:82
entrySet:key:83---value:83
entrySet:key:84---value:84
entrySet:key:85---value:85
entrySet:key:86---value:86
entrySet:key:87---value:87
entrySet:key:88---value:88
entrySet:key:89---value:89
entrySet:key:90---value:90
entrySet:key:91---value:91
entrySet:key:92---value:92
entrySet:key:93---value:93
entrySet:key:94---value:94
entrySet:key:95---value:95
entrySet:key:96---value:96
entrySet:key:97---value:97
entrySet:key:98---value:98
entrySet:key:99---value:99
entrySetforEach循環(huán):key:0---value:0
entrySetforEach循環(huán):key:1---value:1
entrySetforEach循環(huán):key:2---value:2
entrySetforEach循環(huán):key:3---value:3
entrySetforEach循環(huán):key:4---value:4
entrySetforEach循環(huán):key:5---value:5
entrySetforEach循環(huán):key:6---value:6
entrySetforEach循環(huán):key:7---value:7
entrySetforEach循環(huán):key:8---value:8
entrySetforEach循環(huán):key:9---value:9
entrySetforEach循環(huán):key:10---value:10
entrySetforEach循環(huán):key:11---value:11
entrySetforEach循環(huán):key:12---value:12
entrySetforEach循環(huán):key:13---value:13
entrySetforEach循環(huán):key:14---value:14
entrySetforEach循環(huán):key:15---value:15
entrySetforEach循環(huán):key:16---value:16
entrySetforEach循環(huán):key:17---value:17
entrySetforEach循環(huán):key:18---value:18
entrySetforEach循環(huán):key:19---value:19
entrySetforEach循環(huán):key:20---value:20
entrySetforEach循環(huán):key:21---value:21
entrySetforEach循環(huán):key:22---value:22
entrySetforEach循環(huán):key:23---value:23
entrySetforEach循環(huán):key:24---value:24
entrySetforEach循環(huán):key:25---value:25
entrySetforEach循環(huán):key:26---value:26
entrySetforEach循環(huán):key:27---value:27
entrySetforEach循環(huán):key:28---value:28
entrySetforEach循環(huán):key:29---value:29
entrySetforEach循環(huán):key:30---value:30
entrySetforEach循環(huán):key:31---value:31
entrySetforEach循環(huán):key:32---value:32
entrySetforEach循環(huán):key:33---value:33
entrySetforEach循環(huán):key:34---value:34
entrySetforEach循環(huán):key:35---value:35
entrySetforEach循環(huán):key:36---value:36
entrySetforEach循環(huán):key:37---value:37
entrySetforEach循環(huán):key:38---value:38
entrySetforEach循環(huán):key:39---value:39
entrySetforEach循環(huán):key:40---value:40
entrySetforEach循環(huán):key:41---value:41
entrySetforEach循環(huán):key:42---value:42
entrySetforEach循環(huán):key:43---value:43
entrySetforEach循環(huán):key:44---value:44
entrySetforEach循環(huán):key:45---value:45
entrySetforEach循環(huán):key:46---value:46
entrySetforEach循環(huán):key:47---value:47
entrySetforEach循環(huán):key:48---value:48
entrySetforEach循環(huán):key:49---value:49
entrySetforEach循環(huán):key:50---value:50
entrySetforEach循環(huán):key:51---value:51
entrySetforEach循環(huán):key:52---value:52
entrySetforEach循環(huán):key:53---value:53
entrySetforEach循環(huán):key:54---value:54
entrySetforEach循環(huán):key:55---value:55
entrySetforEach循環(huán):key:56---value:56
entrySetforEach循環(huán):key:57---value:57
entrySetforEach循環(huán):key:58---value:58
entrySetforEach循環(huán):key:59---value:59
entrySetforEach循環(huán):key:60---value:60
entrySetforEach循環(huán):key:61---value:61
entrySetforEach循環(huán):key:62---value:62
entrySetforEach循環(huán):key:63---value:63
entrySetforEach循環(huán):key:64---value:64
entrySetforEach循環(huán):key:65---value:65
entrySetforEach循環(huán):key:66---value:66
entrySetforEach循環(huán):key:67---value:67
entrySetforEach循環(huán):key:68---value:68
entrySetforEach循環(huán):key:69---value:69
entrySetforEach循環(huán):key:70---value:70
entrySetforEach循環(huán):key:71---value:71
entrySetforEach循環(huán):key:72---value:72
entrySetforEach循環(huán):key:73---value:73
entrySetforEach循環(huán):key:74---value:74
entrySetforEach循環(huán):key:75---value:75
entrySetforEach循環(huán):key:76---value:76
entrySetforEach循環(huán):key:77---value:77
entrySetforEach循環(huán):key:78---value:78
entrySetforEach循環(huán):key:79---value:79
entrySetforEach循環(huán):key:80---value:80
entrySetforEach循環(huán):key:81---value:81
entrySetforEach循環(huán):key:82---value:82
entrySetforEach循環(huán):key:83---value:83
entrySetforEach循環(huán):key:84---value:84
entrySetforEach循環(huán):key:85---value:85
entrySetforEach循環(huán):key:86---value:86
entrySetforEach循環(huán):key:87---value:87
entrySetforEach循環(huán):key:88---value:88
entrySetforEach循環(huán):key:89---value:89
entrySetforEach循環(huán):key:90---value:90
entrySetforEach循環(huán):key:91---value:91
entrySetforEach循環(huán):key:92---value:92
entrySetforEach循環(huán):key:93---value:93
entrySetforEach循環(huán):key:94---value:94
entrySetforEach循環(huán):key:95---value:95
entrySetforEach循環(huán):key:96---value:96
entrySetforEach循環(huán):key:97---value:97
entrySetforEach循環(huán):key:98---value:98
entrySetforEach循環(huán):key:99---value:99
keySet:key:0---value:0
keySet:key:1---value:1
keySet:key:2---value:2
keySet:key:3---value:3
keySet:key:4---value:4
keySet:key:5---value:5
keySet:key:6---value:6
keySet:key:7---value:7
keySet:key:8---value:8
keySet:key:9---value:9
keySet:key:10---value:10
keySet:key:11---value:11
keySet:key:12---value:12
keySet:key:13---value:13
keySet:key:14---value:14
keySet:key:15---value:15
keySet:key:16---value:16
keySet:key:17---value:17
keySet:key:18---value:18
keySet:key:19---value:19
keySet:key:20---value:20
keySet:key:21---value:21
keySet:key:22---value:22
keySet:key:23---value:23
keySet:key:24---value:24
keySet:key:25---value:25
keySet:key:26---value:26
keySet:key:27---value:27
keySet:key:28---value:28
keySet:key:29---value:29
keySet:key:30---value:30
keySet:key:31---value:31
keySet:key:32---value:32
keySet:key:33---value:33
keySet:key:34---value:34
keySet:key:35---value:35
keySet:key:36---value:36
keySet:key:37---value:37
keySet:key:38---value:38
keySet:key:39---value:39
keySet:key:40---value:40
keySet:key:41---value:41
keySet:key:42---value:42
keySet:key:43---value:43
keySet:key:44---value:44
keySet:key:45---value:45
keySet:key:46---value:46
keySet:key:47---value:47
keySet:key:48---value:48
keySet:key:49---value:49
keySet:key:50---value:50
keySet:key:51---value:51
keySet:key:52---value:52
keySet:key:53---value:53
keySet:key:54---value:54
keySet:key:55---value:55
keySet:key:56---value:56
keySet:key:57---value:57
keySet:key:58---value:58
keySet:key:59---value:59
keySet:key:60---value:60
keySet:key:61---value:61
keySet:key:62---value:62
keySet:key:63---value:63
keySet:key:64---value:64
keySet:key:65---value:65
keySet:key:66---value:66
keySet:key:67---value:67
keySet:key:68---value:68
keySet:key:69---value:69
keySet:key:70---value:70
keySet:key:71---value:71
keySet:key:72---value:72
keySet:key:73---value:73
keySet:key:74---value:74
keySet:key:75---value:75
keySet:key:76---value:76
keySet:key:77---value:77
keySet:key:78---value:78
keySet:key:79---value:79
keySet:key:80---value:80
keySet:key:81---value:81
keySet:key:82---value:82
keySet:key:83---value:83
keySet:key:84---value:84
keySet:key:85---value:85
keySet:key:86---value:86
keySet:key:87---value:87
keySet:key:88---value:88
keySet:key:89---value:89
keySet:key:90---value:90
keySet:key:91---value:91
keySet:key:92---value:92
keySet:key:93---value:93
keySet:key:94---value:94
keySet:key:95---value:95
keySet:key:96---value:96
keySet:key:97---value:97
keySet:key:98---value:98
keySet:key:99---value:99
keySetforEach循環(huán):key:0---value:0
keySetforEach循環(huán):key:1---value:1
keySetforEach循環(huán):key:2---value:2
keySetforEach循環(huán):key:3---value:3
keySetforEach循環(huán):key:4---value:4
keySetforEach循環(huán):key:5---value:5
keySetforEach循環(huán):key:6---value:6
keySetforEach循環(huán):key:7---value:7
keySetforEach循環(huán):key:8---value:8
keySetforEach循環(huán):key:9---value:9
keySetforEach循環(huán):key:10---value:10
keySetforEach循環(huán):key:11---value:11
keySetforEach循環(huán):key:12---value:12
keySetforEach循環(huán):key:13---value:13
keySetforEach循環(huán):key:14---value:14
keySetforEach循環(huán):key:15---value:15
keySetforEach循環(huán):key:16---value:16
keySetforEach循環(huán):key:17---value:17
keySetforEach循環(huán):key:18---value:18
keySetforEach循環(huán):key:19---value:19
keySetforEach循環(huán):key:20---value:20
keySetforEach循環(huán):key:21---value:21
keySetforEach循環(huán):key:22---value:22
keySetforEach循環(huán):key:23---value:23
keySetforEach循環(huán):key:24---value:24
keySetforEach循環(huán):key:25---value:25
keySetforEach循環(huán):key:26---value:26
keySetforEach循環(huán):key:27---value:27
keySetforEach循環(huán):key:28---value:28
keySetforEach循環(huán):key:29---value:29
keySetforEach循環(huán):key:30---value:30
keySetforEach循環(huán):key:31---value:31
keySetforEach循環(huán):key:32
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 護(hù)理文書書寫質(zhì)量監(jiān)控制度
- 古代愛情詩歌課件
- 河南駐馬店市驛城區(qū)2025-2026學(xué)年高一第一學(xué)期期末質(zhì)量監(jiān)測歷史試題(含答案)
- 古代婚嫁禮儀文言知識
- 2025年河南檢察職業(yè)學(xué)院馬克思主義基本原理概論期末考試模擬題及答案解析(必刷)
- 2024年重慶工商職業(yè)學(xué)院馬克思主義基本原理概論期末考試題附答案解析(奪冠)
- 2024年陜西師范大學(xué)馬克思主義基本原理概論期末考試題附答案解析
- 2025年江蘇旅游職業(yè)學(xué)院單招職業(yè)技能考試模擬測試卷帶答案解析
- 2025年山東經(jīng)貿(mào)職業(yè)學(xué)院單招職業(yè)傾向性考試題庫帶答案解析
- 2025年黟縣幼兒園教師招教考試備考題庫帶答案解析
- 北京2025年北京市疾病預(yù)防控制中心面向應(yīng)屆生招聘26人筆試歷年參考題庫附帶答案詳解
- 2025年高考數(shù)學(xué)三輪復(fù)習(xí)考前沖刺練習(xí)05 圓錐曲線(解答題)(教師版)
- 2026年及未來5年中國TFT液晶面板行業(yè)市場發(fā)展數(shù)據(jù)監(jiān)測及投資方向研究報告
- 酒吧消防安全規(guī)范
- 大唐集團(tuán)機(jī)考行測題庫
- DLT 1563-2016 中壓配電網(wǎng)可靠性評估導(dǎo)則
- HJ 377-2019 化學(xué)需氧量(CODCr)水質(zhì)在線自動監(jiān)測儀技術(shù)要求及檢測方法
- (正式版)SHT 3075-2024 石油化工鋼制壓力容器材料選用規(guī)范
- 油脂科技有限公司年產(chǎn)3萬噸油酸項目環(huán)評可研資料環(huán)境影響
- 浙江省水利水電工程施工招標(biāo)文件示范文本
- 神經(jīng)病學(xué)教學(xué)課件:阿爾茨海默病
評論
0/150
提交評論