2

我有一个在程序中填充的 Java HashHap。出于某种原因,地图中的 entrySet 包含我所期望的内容,但是当我查看内部条目表时,它缺少一个值。由于缺少该值,我得到一个空值,它破坏了一切。也许我不像我想的那样理解 HashMaps,但表是否应该包含 entrySet 中的所有条目?谢谢。

在谈论 entrySet 和 table 时,我确实在谈论调试时 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请注意,这样一个“hashmap table entry”(也称为“bucket”)中包含几个“map entry”

例如,看看这个“哈希表条目”:

[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
...

当 aHashMap增长时,它可能会选择扩大其内部的“hashmap 表”,以优化“map 条目”在其“hashmap 表”中的分布。例如,如果“hashmap table”的大小为 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 回答