大家请看如下代码:
String s1 = "hello";
System.out.println(s1.hashCode());

s1+="world";
System.out.println(s1.hashCode());

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

System.out.println(s1==s2);运行结果为:
99162322
-1524582912
-1524582912
false谁能给我解释下为什么

解决方案 »

  1.   

    如果根据 equals(java.lang.Object)  方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。 
      

  2.   

    System.out.println(s1.equals(s2));
    道理楼上基本上说了
    如果2个对象equals相等的话,hashcode是要求相等的
      

  3.   

    又是string题目自己去看http://topic.csdn.net/u/20081231/13/4c342bec-5afd-4ab7-bce7-4b7b98cabbc2.html
      

  4.   

    标题党!
    一般网上面试题大把的==和equals和hasCode等的关系,这个问题应该很多人懂。达不到变态的标准。
      

  5.   

    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;
        }
    hashcode源码,应该是内容一样,hashcode就一样。public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = offset;
    int j = anotherString.offset;
    while (n-- != 0) {
        if (v1[i++] != v2[j++])
    return false;
    }
    return true;
        }
    }
    return false;
        }equals源码,比较的也是内容。可以看到,第一句就是比较引用。
    结论:
    if str1 == str2 then str1.equals(str2);
    反之不成立。
    if str1.equals(str2) then str1.hashCode() == str2.hashCode();
    反之也成立。当然,你可以自己重写Object对象的hashCode方法和equals方法,强制返回false也是可以的。
      

  6.   

    http://www.java2000.net/p15809
    如果2个对象==,则他们一定equals,hashCode一定相等吗?本版版主给的变态实现。
      

  7.   

    又是 == 和 equals 的问题
      

  8.   


    问:两个对象equals返回true,那么他们的hashCode相等吗?答:天晓得,遇到不守规矩的程序员鬼才有办法!!
      

  9.   

    int a=5;
    int b=5;
    a等于b:只比较他们的值//int是内置数据类型String c="你好";//类名 对象名=new 类名();
    String d="你好";
    c不等于d:c和d是两个对象,他们的内存地址肯定是不一样的!boolean flag=c.equals(d);//true,这里只比较值int和Integer
    boolean和Boolean
    是不一样的。注意内置数据类型和类的区别!
      

  10.   

    String很特别,到后面lz会发现更多的!加油!
      

  11.   

    首先要了解 hasCode码是怎么来的,hasCode 是根据你的值计算出来的,那么你的两个 string 类型的值相等,当然也就 hasCode相等,记住了是值.不是对象.String s1 = "hello";相当于是 String s1 = new String("hello"); s1+="world"; 相当是 再创建了一个StringBuffer对象,StringBuffer sr = new StringBuffer(s1.toString()); sr.append("world"); 这样的一个过程,最后再把sr中的值,创建一个新的String对象(String是Final类,是不能更改里面的值),那个s1是不是指向了另一个String对象了。
    那么你的 String s3="helloworld" ;也就是相当 String s3= new String("helloworld");那么s1能和s3相等不?
      

  12.   

    java里面"=="比较的是对象地址
      

  13.   

    String s1 = "abc";
    String s2 = "abc";
    这样s1==s2是因为这种方式string都取自string pool+=操作后,不管最后内容是否相同,相当于StringBuilder的append,保存的是新对象(堆上的),地址不同,intern后再看是不是true至于hashcode,equals为true hashCode须相等,String的equals方法是重写了的,比较的是内容
      

  14.   

    ==比较的是句柄(引用),equals才是比较的对象本身
      

  15.   

    String s1 = "hello"是在缓冲池里建立一个对象,而s1+="world"则是
    所有方法返回的字符串都是在堆内存中创建的字符串,同样,String s2 = "helloworld";
    此时不负责检查维护缓冲池,所以内存地址并不一样。自然==就是false
      

  16.   

    永远不要使用==运算符测试字符串的相等性《JAVA核心技术第I卷》看来看书还是有用的。这可是基础
      

  17.   

    String是引用数据类型,你如果用系统自带的equals去比较,那是比较他们两个的引用地址,当然会报false,建议你重写equals方法,只对String中的内容进行比较
      

  18.   

    Donde Voy Java 群组
    1号: 82085373
    2号: 55191814
    3号: 89238748
    4号: 56418364
    5号: 157181129
    6号: 74671714请勿重复加群......
      

  19.   

    第2个helloword已经在池中出现 所以引入的是同一个对象 不知这样的答案您满意否
      

  20.   

    代码看得不是很懂,是不是可以这么理解
    equals是先判断两个对象是不是同一个对象,是的话返回true,否则再比较两者的hashcode
      

  21.   

    hashcode 方法只跟 equals 方法匹配,而不会跟 == 匹配。强调一下,== 是用来比较变量的,而不是用来比较对象的。
      

  22.   


    public class TestCsdn1 {
    public static void main(String[] args){
    String s1 = "helloworld";
    System.out.println(s1.hashCode());//-1524582912 String s2 = "helloworld";
    System.out.println(s2.hashCode());//-1524582912 System.out.println(s1==s2);//true
    System.out.println(s1.equals(s2));//true

    String s3 = new String("helloworld");
    System.out.println(s1==s3);//false
    System.out.println(s1.equals(s3));//true }
    }如果两个对象的内容相同,hashcode的值也是相同的,equals的值也是相同的。
    ==比较的是地址。这里又分两种情况:
    1.如果你没有new关键字,s2默认的是从缓冲池中寻找有没有helloword字符串,如果有,则将s1的地址赋给s2,此时s1==s2结果为true。
    2.如果你用了new关键字,比如s3,系统为s3重新分配地址。而不是从缓冲池中寻找。s1==s3的结果为false。
      

  23.   


    注意是值的比较还是对象的比较,特别注意String是个意外。
      

  24.   

    String的hashCode()方法被重写了 楼主可以去看一下 只要s1.equals(s2)为true则 两者的值是相等的。
    还有s1+="world"生成的对象相当于new生成的,所以是一个新对象,而下面的s2是双引号生成的对象,所以两个对象不是一个,直接写==的话 当然就为false了
      

  25.   

    看来很多人都知道这个问题,不算N多人无解。equals方法比较的是“s1”、“s2”这两个对象的内容,而“==”比较的是s1和s2这两个对象,打个通俗的比喻。s1 是一个人,s2是另外一个人,两个人都是1.75米。身高的值是一样的,但是你能说s1和s2是同一个人吗?
      

  26.   

    ==判断的是地址 刚开始  String s1 = “hello”;
      hello  是在常量池存放
      s1+=“world”;后 helloworld是在 一个缓冲区内 是stringBuffer的对象 所以内存地址不一样。
    == 自然为false