String s3 = new String("String");
        String s4 = new String("String");
        System.out.println(s3 == s4);
        System.out.println(s3.equals(s4));
        System.out.println(s3.hashCode());
        System.out.println(s4.hashCode());
打印的结果为:
false
true
-1808118735
-1808118735
不明白之处:
hashcode打印的值应该是内存地址。
== 也是比较内存地址的。
但是显示s3与s4的地址相同, System.out.println(s3 == s4)却打印出了false ?

解决方案 »

  1.   

    String   s3   =   new   String( "String "); 
                    String   s4   =   new   String( "String "); s3 s4是2个对象,当然有2个地址了.s3.hashCode()输出的应该是 "String " 的 hashCode
      

  2.   

    噢噢 ,懂了,String的hashcode()被重写了。
      

  3.   

    见APIhashCode 的常规协定是: 在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
     
    如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。 如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。 
      

  4.   

    String   s3   =   new   String( "String "); 
    String   s4   =   new   String( "String "); 
    是在堆上实例化两个对象,分别有两个地址,所以s3==s4为false
    但是,如果String   s3="String ";String s4="String ";因为java常量池的原因s3==s4为true。Sring.hashcode方法被重写,根据字符串的内容生成hashcode,所以相同的内容hashcode肯定相同。