按照hashcode()的定义,他的值是由对象在内存中的地址转换而来的,在下面这个程序中
public class HelloWorld { public static void main(String[] args){

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

//System.out.println(s1.equals(s2));
System.out.println(s2.hashCode());

s2=new String("String");
System.out.println(s2.hashCode());
}
}按照hashcode()的定义,在给s2新建一个对象后,其hashcode()值应该是变化了的,可我得出的结果却与前面是相同的,请问是为什么?

解决方案 »

  1.   

    hashcode 不见得就是从内存地址置换而来的。String 的 hashcode 和它的内容有关系。只在字符串一样,其 hashCode 就是一样的。好像是 Object 的定义中,hashcode 是从地址转换来的,因为 Java 中的所有类都从 Object 继承,所以,如果一个类如果不重载 hashCode 方法的话,这个类的 hashcode 就是从地址转换而来。如果重载了,就要看重载的算法了。
      

  2.   

    hashcode可以随便定义的,就像楼上所说的,看算法了,看需要
      

  3.   

    看一下String的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;
        }
      

  4.   

    所以它的hashCode明显是基于内容的!
      

  5.   

    hashcode是根据一个原始数据经hash函数计算得到的,该函数和数据取决于你自己的定义.
      

  6.   

    String的hashcode与楼主的想法有不同,它并不是根据内存地址生成的,请看看它的实现函数