2

プログラム内にデータが取り込まれている Java HashHap があります。何らかの理由で、マップ内の entrySet には期待どおりの内容が含まれていますが、内部の Entry テーブルを見ると、値がありません。その値が欠落しているため、null が取得され、すべてが壊れます。思ったほど HashMaps を理解していないのかもしれませんが、テーブルには entrySet のすべてのエントリを含める必要がありますか? ありがとう。

entrySet とテーブルについて話すとき、実際にはデバッグ時の HashMap の内部について話しています。これが私の「entrySet」の外観です。

[IS_DELETED=0, COLLECTION_SET_NAME=D-EIUCFOE-SET, MAP_ID=Ic65fd5ffb7c311e09fc6842b2ba7e81a, PRODUCT_ID=1, USER_ID=U0158703, WM_DIFFVER=DiffBase, DISTRICT_CODE=TX_N_DIS, WM_CODE=NC, MODIFIED_DATE=2012-09-04 10:13:08.973]

そして、ここに私のテーブルがどのように見えるかがあります:

[IS_DELETED=0, COLLECTION_SET_NAME=D-EIUCFOE-SET, null, null, PRODUCT_ID=1, null, null, null, WM_DIFFVER=DiffBase, null, DISTRICT_CODE=TX_N_DIS, WM_CODE=NC, MODIFIED_DATE=2012-09-04 10:13:08.973, null, null, null]

したがって、この HashMap が作成された後でコードが MAP_ID を検索すると、null が表示されて爆発します。

table   HashMap$Entry<K,V>[16]  (id=248)    
    [0] HashMap$Entry<K,V>  (id=270)    
        hash    -1013369904 
        key "IS_DELETED" (id=883)   
        next    null    
        value   BigDecimal  (id=884)    
    [1] HashMap$Entry<K,V>  (id=271)    
        hash    449814449   
        key "COLLECTION_SET_NAME" (id=896)  
        next    HashMap$Entry<K,V>  (id=898)    
        value   "D-EIUCFOE-SET" (id=899)    
    [2] null    
    [3] null    
    [4] HashMap$Entry<K,V>  (id=275)    
        hash    -1942791868 
        key "PRODUCT_ID" (id=900)   
        next    HashMap$Entry<K,V>  (id=901)    
        value   BigDecimal  (id=902)    
    [5] null    
    [6] null    
    [7] null    
    [8] HashMap$Entry<K,V>  (id=276)    
        hash    -1109968520 
        key "WM_DIFFVER" (id=904)   
        next    null    
        value   "DiffBase" (id=905) 
    [9] null    
    [10]    HashMap$Entry<K,V>  (id=278)    
        hash    -1920690854 
        key "DISTRICT_CODE" (id=906)    
        next    null    
        value   "TX_N_DIS" (id=907) 
    [11]    HashMap$Entry<K,V>  (id=279)    
        hash    -1948303941 
        key "WM_CODE" (id=909)  
        next    null    
        value   "NC" (id=910)   
    [12]    HashMap$Entry<K,V>  (id=280)    
        hash    1002278668  
        key "MODIFIED_DATE" (id=912)    
        next    null    
        value   TIMESTAMP  (id=913) 
    [13]    null    
    [14]    null    
    [15]    null    

MAP_ID エントリを取得できませんが、データベースから文字列として返されます。

4

2 に答える 2

2

いくつかのことを明確にしましょう。

  1. Map.Entryマップの論理的な「エントリ」です。これを「マップ エントリ」と呼びましょう。
  2. HashMap.table衝突するモジュロ値HashMap Mapを持つ「マップ エントリ」のリストを格納する、実装の内部配列です。hashCodeこのような「ハッシュマップ テーブル エントリ」(「バケット」とも呼ばれる) には、いくつかの「マップ エントリ」が含まれていることに注意してください。

たとえば、この「ハッシュマップ テーブル エントリ」を見てください。

[4] HashMap$Entry<K,V>  (id=275)    
    hash    -1942791868 
    key "PRODUCT_ID" (id=900)   
    next    HashMap$Entry<K,V>  (id=901)    
    value   BigDecimal  (id=902)    

id=901同じハッシュ値 (より正確には ) の「次の」「マップ エントリ」であるにリンクしていることに注意してhash % 16 == 4ください。基本的な考え方は次のとおりです。

// "HashMap table" has 16 "hashmap table entries" (at first, before growing)
[0] with   1 "hashmap entry"
[1] with > 1 "hashmap entry"
[2] empty
[3] empty
...

が成長する間、HashMap「ハッシュマップ テーブル」全体の「マップ エントリ」の分散を最適化するために、内部の「ハッシュマップ テーブル」を拡大することを選択する場合があります。たとえば、「ハッシュマップ テーブル」のサイズが 256 の場合、hashCode()値に適用されるモジュロも 256 になり、hashCode()衝突のリスクが軽減されます。

于 2012-09-05T15:16:27.913 に答える
0

問題は、Java がそれ自体がリストの実装であるバケットに何かを格納しているという事実から生じる可能性があると思います。これは興味深い記事です:

http://javarevisited.blogspot.co.uk/2011/02/how-hashmap-works-in-java.html

本当の助けを提供できるように、いくつかのコードを提供してもらえますか?

于 2012-09-05T15:15:14.543 に答える