各位高手下面的代码为什么会出现这样的结果,如果把String看做对象为什么s3和s4的hashCode会相等,“==”比较的是两个引用是否指向同一个对象,那么是否就是比较的hashCode,我想应该不是,要不然s3==s4的结果应该是true,请高手指点一下运行结果:
true
true
s1.hashCode(): 3254818
s2.hashCode(): 3254818
false
true
s3.hashCode(): 3254818
s4.hashCode(): 3254818public class TestDemo3
{
public static void main(String[] args)
{
String s1 = "java";
String s2 = "java";
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
System.out.println("s1.hashCode(): " + s1.hashCode());
System.out.println("s2.hashCode(): " + s2.hashCode());
String s3 = new String("java");
String s4 = new String("java");
System.out.println(s3 == s4);
System.out.println(s3.equals(s4));
System.out.println("s3.hashCode(): " + s3.hashCode());
System.out.println("s4.hashCode(): " + s4.hashCode());
}
}

解决方案 »

  1.   

    S1 S2指向的是同一个数据池中的相同字符串,这里共用一个数据空间。String的直接指向是一个特例但是你经过new这个操作之后,性质就完全不一样了。
    s3= new string("java") 这里是在内存中建立了一个空间 里边存放了java 这个字符串
    s4 = new string("java") 这也同样 重新 建立了一个空间,存放java   =、= 注意这里是重新建立空间,而不是直接引用。
    因为他们所在地址不同所以 s3==s4时结果为false.
      

  2.   

    s3  s4 是new出来的  直接被分配到堆空间了 所以 s3==s4 是false
      

  3.   

    楼上的说得对
    当以String s1 = "java"; 
        String s2 = "java"; 
    这种形式定义时S1,S2是共同指向堆内存里面的一块缓冲池
    用new定义的话系统把它分配给堆内存里不同的地址空间。
    equals比较的是对象的内容 ==比较的是引用,当两个引用指向同一个对象是才返回TRUE
    hashConde 有这样的约定
    当s1.equals(s2)==true 时 一定s1.hashCode==s2.hashCode
    当s1.hashCode!=s2.hashCode 时 一定s1.equals(s2)==false
    当s1.hashCode==s2.hashCode时 不一定s1.equals(s2)==true