Java中等于号==和equals()方法的区别
2021-05-07 本文已影响0人
雁阵惊寒_zhn
一个例子
public class Test {
private int value;
public Test(int value){
this.value = value;
}
public static void main(String[] args)
{
String s1 = new String("HELLO");
String s2 = new String("HELLO");
System.out.println("s1 == s2 " + (s1 == s2));
System.out.println("s1.equals(s2) " + s1.equals(s2));
Test test1 = new Test(1);
Test test2 = new Test(1);
System.out.println("test1 == test2 " + (test1 == test2));
System.out.println("test1.equals(test2) " + test1.equals(test2));
}
@Override
public boolean equals(Object test){
if (test == this){
return true;
}
if (!(test instanceof Test)){
return false;
}
Test t = (Test) test;
if (this.value == t.value){
return true;
}
return false;
}
@Override
public int hashCode() {
return 1;
}
}
执行结果:
s1 == s2 false
s1.equals(s2) true
test1 == test2 false
test1.equals(test2) true
由上面的例子,我们来谈区别
- 很显然,==是操作符,equals()是一个方法
- 操作符==进行的是引用的比较,也就是两个对象的地址比较。方法equals()是内容的比较。换言之,操作符==检查两个对象是否指向相同的内存地址,而方法equals() 比较两个对象的值是否相同。
由上面的例子,补充一些知识点
- 如果类定义中没有重写方法equals() ,则默认使用这个类最近的父类的equals() 方法。
- 当重写方法equals() 时,也要同时重写hashCode()方法。保证两个相等(equals() 方法结果为true)的对象,他们的哈希值也要相等(hashCode()返回相同的值)。为什么相等对象的哈希值要相同?这里我们举一个反例论证更加直观,假如两个相等对象的哈希值不同,在作为key放入HashMap结构中时,这两个相等的对象就会放入到不同的桶中,在某种意义上HashMap结构中存在key相等的两个对象。