java - 映射条目出现在 HashMap.entrySet() 中,但不在内部 HashMap.table 中

标签 java data-structures collections hashmap

我有一个正在程序中填充的 Java HashHap。由于某种原因,映射中的entrySet包含我所期望的内容,但是当我查看内部Entry表时,它缺少一个值。由于缺少该值,我得到了一个空值,它破坏了一切。也许我不像我想象的那样理解 HashMap,但是表应该包含 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 条目,但它是以字符串形式从数据库返回的。

最佳答案

让我们澄清一些事情。

  1. Map.Entry 是 map 中的逻辑“条目”。我们将其称为“ map 条目”
  2. HashMap.tableHashMap Map 实现的内部数组,存储具有冲突 hashCode 的“映射条目”列表 模值。请注意,这样的“ HashMap 表条目”(也称为“桶”)中包含多个“映射条目”

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

[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增长时,它可能会选择扩大其内部“ HashMap 表”,以优化“映射条目”在其“ HashMap 表”中的分布。例如。如果“ HashMap 表”的大小为 256,则应用于 hashCode() 值的模数也将为 256,从而降低 hashCode() 碰撞风险

关于java - 映射条目出现在 HashMap.entrySet() 中,但不在内部 HashMap.table 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12283758/

相关文章:

java - 在Kotlin/Java中将列表过滤到特定大小

java - 为简单的数据结构创建单独的类在 Objective-C 中是矫枉过正的

java - 最近邻算法和贪心算法有什么区别?

python - 解析表示元组列表的字符串

algorithm - BFS 算法 Introduction to algorithms book by cormen,leiserson etal

java - TreeSet/包含方法

java - 谷歌云存储 : Could not initialize class OauthRawGcsServiceFactory

java - 我如何从字符串中获取int数组

java - 将两个计时器与多个实例同步 (Java)

java - 超越 Java 中的 Integer.MAX_VALUE 约束