我用String s = "java"和String ss = new("java")两种方式创建字符串,然后都用hashCode()方法获得他们的hashCode,发现这2个的hashCode是一样的,这是为什么?获得hashCode是引用变量的还是什么?两个引用变量s和ss都是指向的常量池中的"java" 这个对象吗?ss难道不是指向的heap中开辟的那个新的"java"对象?搞不懂了。

解决方案 »

  1.   


    //hashCode的源代码:
     public int hashCode() {
    int h = hash;
    if (h == 0) {
        int off = offset;
        char val[] = value;
        int len = count;            for (int i = 0; i < len; i++) {//取决于里面的每一个字符的值
                    h = 31*h + val[off++];
                }
                hash = h;
            }
            return h;
        }
      

  2.   

    不同的对象hashCode一样有什么奇怪的,又没谁规定不同的对象hashCode就一定要不一样
      

  3.   

    String的hashCode()是这样计算的:
    s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
    因此字符串内容相同的两个String对象,哪怕它们是不同的实例,hashCode也会是相同的。
      

  4.   

    谢谢,我还以为每一个不同的引用变量都会有不同的hashcode,现在明白了
      

  5.   

    String s = "aaa",是表示在StringPol中创建这么一个值,然后S引用它。而String st = new String("aaa")时,是现在StringPol中寻找是不是已经有"aaa"这个东西,如果有就直接复制到堆中,若没有要在堆中new一个出来,然后把这个东西copy一份到StringPol中去。而且hashCode()还要与equals()配合起来用的。如果两个对象的equals()返回false,它们的hashCode可以不一定不同。