まず、ソースコード添付のJava実装8
1 / ** PUTの導入及びputIfAbsent * / 2 最終 V putVal(Kキー、V値、ブールonlyIfAbsent){ 3 であれば(キー== NULL ||値== NULL)スロー 新しい(NullPointerExceptionが)。 4 int型のハッシュ= スプレッド(key.hashCode())。 5 INT binCount = 0 。 6 ため(ノード<K、V> []タブ= 表;;){ 7 ノード<K、V> F。int型N、I、FH; 8 もし(タブ== nullを||(= N-tab.length)== 0)// 最初の使用、テーブル全体がヌルである 9。 タブ= initTable(); 10 他 IF((F = tabAt(タブ、Iは、N - (= 1)。ハッシュ・))== NULL ){ 11 IF(casTabAt(タブ、I、NULL 、 12である 新しい新しいノード<K、V>(ハッシュ、キー、値、NULL ))) 13である BREAK ; // NOロック空に追加するときビン 14 } 15 他 のiF((FH = f.hash)==移動される) // -1のノードのハッシュ値、必要に転送すべきノードForwardingNode、後続ノードの代表的な 16 =タブhelpTransfer(タブ、F) 。17 他{ 18は V OLDVAL = NULL ; 19 同期(F){ 20は、 IF(tabAt(タブ、I)== F){ //は正しいコードを得るためのホットゾーンは、第一、再び実行されますi番目のノードが変更されていない前に記録を確認し(すなわち、離れて移行されていない) 21である IF(FH> = 0){ // を確認現在のノードのハッシュ値が正常ノード(ノード他の補助、例えばForwardingNode、TreeBinを表すこと、 ReservationNode) 22である BinCount = 1 ; 23である ため(ノード<K、V> E = F ;; ++ BinCount){ 24 K EK、 25 IF(ハッシュe.hash == && 26である ((EK = e.key)は== ||キー 27 (EK!= NULL && key.equals(EK)))){ //は、ターゲット・ノードを解析するスプレッドに基づいていますそして(同じキーまたはキー参照同等の)同じハッシュ値 28 OLDVAL = e.val; 29 IF(!onlyIfAbsent)は 30 e.val = 値; 31である BREAK ; 32 } 33である ノード<K、V> PRED = E; 34であります もし((E = e.next)== NULL){ // 現在のノードがリストの最後に達すると、追記新しい要素場合 35 pred.next = 新しい新しいノード<K、V> (ハッシュ、キー、 36 値は、NULL ) ; 37 BREAK ; 38である } 39 } 40 } 41である 他 のiF(F instanceofの TreeBin){ // FHは0以上であり、-2、要素型TreeBin場合 42である ノード<K、V>P; 43 binCount = 2 。 44 であれば((P =((TreeBin <K、V> )F).putTreeVal(ハッシュ、キー、 45 値))!= NULL ){ 46 OLDVAL = p.val。 47 もし(!onlyIfAbsent) 48 p.val = 値; 49 } 50 } 51 } 52 } 53 であれば(binCount!= 0){ 54が IF(BinCount> = TREEIFY_THRESHOLD)// インサート要素、ノードの数のリストは単一のスロットに等しい場合8より大きい場合、スロットの赤黒木 55 treeifyBin(タブ、I); 56は、 IF(OLDVAL =!ヌル) 57は、 リターンOLDVAL; 58 BREAK ; 59 } 60 } 61である } 62で addCount(1L 、BinCount); 63は 、戻り NULL ; 64 }
A