我有一个正在程序中填充的 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 条目,但它是以字符串形式从数据库返回的。
最佳答案
让我们澄清一些事情。
Map.Entry
是 map 中的逻辑“条目”。我们将其称为“ map 条目”HashMap.table
是HashMap
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/