HashMap中的条目被完全不同的键覆盖?

时间:2010-08-11 11:37:08

标签: java

我有一个Java HashMap用于存储一些基本的字符串值:

Map<String, String> map = new HashMap<String, String>();
map.put("Id", task.getStorageId());
map.put("Name", task.getName());
map.put("Description", task.getDescription());

在一种用法下,Id条目会被Description条目覆盖,每次都不会失败。我在调试器中看过它 - Id插入正常,Name插入正常,然后插入Descroption时,它会覆盖Id条目。在应用程序的另一部分使用完全相同的代码和密钥,它没有任何问题。完全糊涂了。这里发生了什么?

修改

也许我应该提到(虽然它似乎没有相关性),这是在Android上发生的,而不是在JVM中。这可能是问题吗?我也发现很难相信,但代码块就像提供的代码片段一样简单。我将尝试捆绑一个演示它的Android应用并发布到某个地方。

5 个答案:

答案 0 :(得分:5)

您可能没有看到的条目存在,查看表的modCount,您应该看到正确的条目数。这意味着发生了哈希冲突。基本上,2个键被散列到表中的同一个桶中。如果您查看具有原始密钥的存储桶,则它具有下一个字段,该字段是指向您认为丢失的其他条目的指针。

答案 1 :(得分:4)

这绝不应该发生。 HashMap使用密钥的hashCode()方法来索引Map的条目。 由于

"Id".hashCode() == "Description".hashCode()

是假的(是的,我只是为了理智而对它进行了测试),put(String, String)操作没有干扰。 做一些检查,确保你的代码与你上面发布的代码完全相同。

答案 2 :(得分:3)

没有发生在我身上:

import java.util.Map;
import java.util.HashMap;

public class MapDemo
{
   public static void main(String[] args)
   {
      Map<String, String> map = new HashMap<String, String>();
      map.put("Id", "task.getStorageId()");
      map.put("Name", "task.getName()");
      map.put("Description", "task.getDescription()");

      System.out.println("map: " + map);
   }
}

这是输出:

com.intellij.rt.execution.application.AppMain MapDemo
map: {Name=task.getName(), Description=task.getDescription(), Id=task.getStorageId()}

Process finished with exit code 0

答案 3 :(得分:3)

也许您调试的代码和您使用的源不同步?也许你已经改变了你的来源但是没有正确编译?也许你有一个带有旧版软件的jar你的类路径?

答案 4 :(得分:0)

我有相同的经验,在调试中看起来像一个条目被一个完全不同的条目覆盖。当我试图检索它时,它返回null。

但这是因为,在检索时我使用了simplecase值作为键。当使用确切的格式时,值正在正确返回。

例如:

  map.put("A", "value1");
  map.put("B", "value2");
  map.put("C", "value3");

  map.get(a) --> null
  map.get(A) --> value1