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 ?
String s4 = new String( "String "); s3 s4是2个对象,当然有2个地址了.s3.hashCode()输出的应该是 "String " 的 hashCode
如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。 如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
String s4 = new String( "String ");
是在堆上实例化两个对象,分别有两个地址,所以s3==s4为false
但是,如果String s3="String ";String s4="String ";因为java常量池的原因s3==s4为true。Sring.hashcode方法被重写,根据字符串的内容生成hashcode,所以相同的内容hashcode肯定相同。