JavaLinkedHashMap深入分析源碼_第1頁
JavaLinkedHashMap深入分析源碼_第2頁
JavaLinkedHashMap深入分析源碼_第3頁
JavaLinkedHashMap深入分析源碼_第4頁
JavaLinkedHashMap深入分析源碼_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論