Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的哈希键_Java_Hashmap_Hashtable_String Hashing - Fatal编程技术网

Java中的哈希键

Java中的哈希键,java,hashmap,hashtable,string-hashing,Java,Hashmap,Hashtable,String Hashing,在java中,使用字符串作为Hashmap的键时,得到的结果与使用字符串hashcode作为Hashmap中的键时略有不同 有什么见解吗 当我在HashMap中将字符串hashcode用作键时 不能将哈希代码本身用作密钥。哈希代码不是唯一的——完全允许两个不相等的值具有相同的哈希代码。您应该使用字符串本身作为键。映射将首先比较散列码(以快速缩小候选匹配),然后与equals进行比较,以获得真正的字符串相等性 当然,这是假设你的代码真的是你的问题,例如 HashMap<String, Str

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

有什么见解吗

当我在HashMap中将字符串hashcode用作键时

不能将哈希代码本身用作密钥。哈希代码不是唯一的——完全允许两个不相等的值具有相同的哈希代码。您应该使用字符串本身作为键。映射将首先比较散列码(以快速缩小候选匹配),然后与
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");
HashMap goodMap=newhashmap();
goodMap.put(“foo”、“bar”);
HashMap badMap=新HashMap();
put(“foo.hashCode(),“bar”);
如果这真的是您的代码的样子,只需使用
HashMap

从(我的)文档中:

hashCode的总合同为:

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

当然。不同的字符串可以具有相同的哈希代码,因此如果在映射中存储两个这样的字符串作为键,则将有两个条目(因为字符串不同)。如果您使用它们的hashCode作为键,您将只有一个条目(因为它们的hashCode是相同的)


哈希代码不用于判断两个键是否相等。它只用于为密钥分配一个bucket。一旦找到bucket,bucket中包含的每个key都会与具有equals的新key进行比较,如果找不到相等的key,就会将key添加到bucket中。

问题是,即使两个对象不同,也不意味着它们的hashcode也不同

两个不同的对象可以共享相同的哈希代码。所以,不应该将它们作为HashMap键

另外,由于从
Object.hashCode()
方法返回的哈希代码属于
int
类型,因此只能有
2^32
不同的值。这就是为什么根据散列算法,不同对象会有“冲突”

简而言之:-


!obj.equals(obj1)
不能确保
obj.hashCode()!=obj1.hashCode()
HashCodes
对于同一个字符串可以是相同的,也可以是不同的,所以要小心。也许这就是为什么你会得到不同的结果

给你。请参阅Jon Skeet接受的答案。

只有当哈希函数是一个完美的哈希函数时,才可以使用哈希代码作为密钥(请参阅示例)。只要您的关键对象不在内存中,您就可以节省内存。

您能更具体一点吗?显示一些您面临此问题的代码段。为什么希望使用不同的键来产生相同的结果?不会的。我会用
!obj.equals(obj1)
在最后一行,因为这是重要的部分。谢谢大家的回答。我试图避免将密钥存储为字符串,因为它将消耗更多内存!不要在没有测量的情况下就得出这个结论。为什么它会使用更多的内存?地图上没有钥匙的副本。它只是引用了钥匙,我知道。但是当我有超过两百万张唱片时,存储他们的字符串键会有很大的不同@JB@user1785771:他们使用更多的内存是有充分理由的:重要数据比哈希代码的32位要多。如果需要存储大量字符串,则需要大量内存。内存很便宜;由于不正确地使用哈希映射而导致的错误很容易造成高昂的代价。