[英]Example of ==, equals and hashcode in java
鉴于这种:
String s1= new String("abc");
String s2= new String("abc");
String s3 ="abc";
System.out.println(s1==s3);
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
System.out.println(s3.hashCode());
输出是:
false
false
true
true
96354
96354
96354
这里==
为每个对象赋予false,但每个String对象的哈希码是相同的。 为什么会这样?
==
确实比较对象的真实相等性(我的意思是 - 两个引用指向同一个对象),而不是它们的内容,而.equal
比较内容(至少对于String)。
String a = new String("aa");
String b = new String("aa");
a
和b
指向不同的对象。
另请注意,如果对象相等,则它们的哈希序列必须相同,但如果哈希码相同,则并不意味着对象相等。
equals合同说如果是o1.equals(o2)
,那么o1.hashCode() == o2.hashCode()
。 它没有指定任何关于不等对象的哈希码的内容。 你可以有一个类似的方法
public int hashCode()
{
return 42;
}
它履行了合同。 只是期望哈希码与对象的值相关,以使哈希表更有效地工作。
现在,至于为什么你的==
不起作用,将始终通过引用比较两个对象。 也就是说,如果o1 == o2
,则o1
和o2
是完全相同的对象。 这很少是你想要的; 你通常想看看是否o1.equals(o2)
。
当您使用==
,您将比较两个变量是否保持对同一个Object的引用。 换句话说, s1 == s2
就像问: s1
和s2
变量是否引用相同的String对象? 即使两个String对象具有相同的“abc”值,情况也是如此。
使用equals()时,您正在比较两个对象的值。 两个对象可能不相同,但它们的值(在本例中为“abc”)是相同的,因此它返回true
。
如何定义一个对象是否与另一个对象相等? 随你(由你决定。 在这种情况下,String对象已经为您定义了这个,但是例如,如果您定义了Person
对象,您如何知道人P1是否等于P2? 你可以通过重写equals()
和hashCode()
做到这一点。
==告诉你两个变量引用是否指向内存中的同一个对象,仅此而已。 equals()
和hashCode()
都查看对象的内容,每个都使用自己的算法进行计算。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.