在哪种情况下,java中的hashmap会丢失一些条目?

Wae*_*ael 3 java weblogic hashmap key-value

我写了一个hashmap并用键/值条目填充它.值是对象.该地图包含至少1万个条目.稍后,当我想使用某个键获取值时,地图似乎找不到此条目.这太奇怪了.即使每次在不同的条目下失败也是如此.我该怎么做才能解决这个问题?我使用weblogic作为服务器.我应该玩任何环境价值吗?

Ste*_*n C 12

以下是一些可能导致条目"丢失"的事情:

  • 在您的密钥对象上错误地实现了equals/hashcode方法.这两种方法需要符合哈希表的"契约"才能正常工作.最重要的财产是:

    key1.equals(key2) IMPLIES key1.hashcode() == key2.hashcode
    
    Run Code Online (Sandbox Code Playgroud)
  • 在地图中使用键时更改的可变键对象.特别是,如果密钥更改导致密钥的哈希码发生更改,则它将丢失.(在这种情况下,如果您遍历整个地图,条目将显示.但是使用查找的地图操作将找不到它们......因为它们位于错误的哈希链上.)

    最安全的方法是使用不可变的密钥类.

  • 在没有正确同步的情况下在多线程应用程序中使用映射.这可能导致地图数据结构的损坏,这可能表现为丢失的条目.

  • 您不知道的应用程序的其他部分是删除条目.


陈述/声明您必须覆盖equals并且hashcode/不正确的答案.在某些情况下Object,这些方法的实现正是所需要的.你必须做的就是确保:

  1. 您正在使用您的用例所需的适当形式的密钥相等,以及
  2. 你的equalshashcode遵守"合同".

我该怎么做才能解决这个问题?

我建议进行代码检查以检查上述问题.

调试是另一种选择.例如,您可以查看是否可以在错误的哈希链上找到缺少的条目.但是,我怀疑这种做法可能会有点"失误".

我使用weblogic作为服务器.

不相关......除非你碰巧使用的是由Weblogic而不是J2SE实现的Map实现类.(查看对象的类名.)

我应该玩任何环境价值吗?

无济于事