public static void main(String args[]) {
 String str1 = new String("王旭东");
 String str2 = new String("王旭东");
 StringDemo sd = new StringDemo();

 System.out.println(str1.equals(str2));
 System.out.println(str1 == str2);

 System.out.println(sd.hashCode());
 System.out.println(str1.hashCode());
 System.out.println(str2.hashCode());
          }
为什么上面的str1与str2的hashCode值相等????

解决方案 »

  1.   

    hashCode
    public int hashCode()返回此字符串的哈希码。String 对象的哈希码根据以下公式计算: 
     s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
     使用 int 算法,这里 s[i] 是字符串的第 i 个字符,n 是字符串的长度,^ 表示求幂。(空字符串的哈希值为 0。) 覆盖:
    类 Object 中的 hashCode
    返回:
    此对象的哈希码值。
    另请参见:
    Object.equals(java.lang.Object), Hashtable
    这是API文档中的关于hashCode方法的说明,楼主看看就明白了!
      

  2.   

    看看那个公式,就知道该怎么算了!知道该怎么算了,就知道为什么相同了!
    建议楼主平时多看看API文档,虽然这个问题开始我也不清楚,但是我看了API文档后,我一下子就清楚了!
      

  3.   

    ok,请问:
      不同对象它有不同的hashCode值,那上面的str1和str2都分别通过new关键来声明了,说明str1和str2是不同的对象了,为什么它们的hashCode值还是一样的,如果照您所说的那个公式的话,下面的代码和开始的还有什么区别了呢????
            public static void main(String args[]) {
                    String str2 = new String("王旭东");
    String str3 = "王旭东";
    System.out.println(str2.hashCode());
    System.out.println(str3.hashCode());
            }
      

  4.   

    没有区别。JAVA会先去找常量池里是否已经有那个相同内容的string对象。有就直接调用。所以没有区别。
      

  5.   

    str1与str2虽然是不同对象,但是string的hashCode()计算方法如1楼所说,结果是相同的  String str2 = new String("王旭东");
    String str3 = "王旭东";
    这个声明,第一个是直接在堆区创建对象(而不在池中查找及创建),第二个是先在对象池中查找是否有 "王旭东",如果池存在,则引用指向池中的"王旭东",如果池中不存在,则先池中创建"王旭东",再指向。
      

  6.   

    那各位高手,你们所说的我也都理解,但现在我想说的是,开始我对hashCode的理解是hashCode可以判断对象是否相同,但通过Stirng类这个特例,不就说明hashCode不能判断对象是否为同一个对象!!这样对吗????
      

  7.   

    常量池机制仅仅对String,Integer等有限的几个类别有效。并不代表所有的对象都有效。
      

  8.   

    String str1 = new String("王旭东");
    String str2 = new String("王旭东");
    String这个类很特殊,如果想上面这样的是直接赋值,str1 放在的是常量池里面,str2 在池里找有没有"王旭东",有的话就把str2 也指向str1 指向的的那块地址(这地址在常量池中),如果没有的话,则自己创建一个地址,然后str2 指向它,那样的话就不同