2

为什么这段代码给出一个负哈希码?

import java.util.HashSet;
import java.util.Set;

public class Ab {

    /**
     * @param args
     */
    public static void main(String[] args) {
    String s1="Operations on a dynamic set can be grouped into two categories queries, which simply return information about the set, and modifying operations, which change the set. Here is a list of typical operations. Any specific application will usually   require only a few of these to be implemented Some dynamic sets presuppose that the keys are drawn from a totally ordere, such as the real numbers, or the set of all words under the usual alphabetic ordering. A total ordering allows us to define the minimum element of the set, for example, or to speak of the next element larger than a given element in a set.Operations on dynamic sets Operations on a dynamic set can be grouped into two categories: q";

    System.out.println(s1.hashCode());
    String s2="abc";
    System.out.println(s2.hashCode());
    }

}
4

3 回答 3

3

String 类覆盖hashCode()以产生确定性结果。结果与内存地址无关。String.hashCode() Javadoc显示了用于计算它的公式:

String 对象的哈希码计算为 s[0]*31^(n-1) + s 1 *31^(n-2) + ... + s[n-1]

使用 int 算术,其中 s[i] 是字符串的第 i 个字符,n 是字符串的长度,^ 表示求幂。(空字符串的哈希值为零。)

请注意,即使是相对较短的字符串,该值对于整数也可能会变得太大。在计算过程中,只要发生溢出,就只保留最低有效的 32 位。在计算结束时,如果设置了结果整数的最高有效位,则整数为负数,否则为正数。

于 2013-07-05T05:03:45.347 回答
1

我已经用谷歌搜索了很多次,并且对哈希码是内存表示的十六进制代码感到困惑,我知道内存地址始终是正数,那么这意味着哈希码只是对象内容的代码然后 jvm 存储在哪里?

这并不完全正确。在这种情况下,默认实现Object.hashCode返回接收对象的内存地址的表示。但是,许多类会覆盖默认实现,并且String是其中之一。Object.hashCodefor的覆盖String不是身份哈希码,而是哈希码。因此,它不是接收对象的内存地址的表示,而是String.

当然,即使将内存地址转换为哈希码(对于 的默认实现Object.hashCode)也可能产生负哈希码,很明显,覆盖的定义Object.hashCode可能会产生负哈希码。

事实上,这个微不足道的哈希码很糟糕,但 100% 合法:

@Override
public int hashCode() { return -42; }

也就是说,它与 的“合同”是一致的Object.hashCode

于 2013-07-05T04:35:09.353 回答
0

简单地说,hashcode 是哈希函数返回的数字,用于将可变长度数据映射到固定长度。

你可以在这里找到关于哈希码的好信息 http://www.thejavageek.com/2013/06/27/what-are-hashcodes/

对于java编程中的哈希码,请参见以下链接

http://www.thejavageek.com/2013/06/28/significance-of-equals-and-hashcode/

于 2013-07-05T04:31:07.337 回答