我有一个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应用并发布到某个地方。
答案 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