在Java中散列密钥

use*_*771 5 java hashtable hashmap string-hashing

在java中,当我使用String作为Hashmap的键时,我得到的结果与我在HashMap中使用字符串hashcode作为键时的结果略有不同.

任何见解?

Jon*_*eet 12

当我使用字符串哈希码作为HashMap中的键.

不能将哈希码本身用作密钥.散列码不是唯一的 - 完全允许两个不相等的值具有相同的散列码.您应该使用字符串本身作为键.该地图将然后比较哈希码第一(以缩小候选快速匹配),然后用比较equals真正的字符串相等.

当然,这是假设你的代码真的像你的问题那样,例如

HashMap<String, String> goodMap = new HashMap<String, String>();
goodMap.put("foo", "bar");

HashMap<Integer, String> badMap = new HashMap<Integer, String>();
badMap.put("foo".hashCode(), "bar");
Run Code Online (Sandbox Code Playgroud)

如果这真的是你的代码的样子,那就HashMap<String, String>改用它吧.

来自Object.hashCode()(强调我的)文档:

hashCode的一般契约是:

  • 每当在执行Java应用程序期间多次在同一对象上调用它时,hashCode方法必须始终返回相同的整数,前提是不修改对象上的equals比较中使用的信息.从应用程序的一次执行到同一应用程序的另一次执行,该整数不需要保持一致.
  • 如果两个对象根据equals(Object)方法相等,则对两个对象中的每一个调用hashCode方法必须生成相同的整数结果.
  • 如果两个对象根据equals(java.lang.Object)方法不相等,则不需要在两个对象中的每一个上调用hashCode方法必须生成不同的整数结果.但是,程序员应该知道为不等对象生成不同的整数结果可能会提高哈希表的性能.