在下面的代码中,hashCode()
似乎创建了2个对象。然后,尽管s1 == s3
给出了true,但是为什么s1 == s4
给出了false?
公共类主要{
public static void main(String[] args) {
String s1 = new String("jordi") ;
String s2 = s1.toUpperCase() ;
String s3 = s1.toLowerCase() ;
String s4 = new String("jordi") ;
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
System.out.println(s3.hashCode());
System.out.println(s4.hashCode());
System.out.println(s1==s2);
System.out.println(s1==s3);
System.out.println(s1==s4);
}
}
这给出的输出为:
101312786
70775026
101312786
101312786
false
true
false
答案 0 :(得分:0)
s1 == s4
这将执行参考比较。因此,您正在比较s1和s4是否指向同一个对象(它们不是-因为您显式创建了两个不同的对象)
答案 1 :(得分:0)
当我们使用==运算符进行s1和s4比较时,这是假的,因为它们在内存中都有不同的地址。比较内存地址
答案 2 :(得分:0)
值对象(身份不重要且值是唯一重要的对象,例如String
和Integer
)覆盖equals
和hashCode
,例如,它们可以用作HashMap
中的键。专门针对hashCode
is specified in detail的String
值,以便具有相同内容的任何两个字符串将散列为相同的值。
您的s1
和s3
是同一对象,因为String#toLowerCase()
has an optimization返回this
并避免在整个字符串已经小写的情况下避免创建新对象。
答案 3 :(得分:-3)
对字符串使用.equals方法而不是==。当您尝试用==而不是.equals()比较两个字符串时,Java变得有些棘手了
这是您的代码,但已修复。
public static void main(String[] args) {
String s1 = new String("jordi");
String s2 = s1.toUpperCase();
String s3 = s1.toLowerCase();
String s4 = new String("jordi");
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
System.out.println(s3.hashCode());
System.out.println(s4.hashCode());
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
System.out.println(s1.equals(s4));
}