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

由上面的例子,我们来谈区别

  1. 很显然,==是操作符,equals()是一个方法
  2. 操作符==进行的是引用的比较,也就是两个对象的地址比较。方法equals()是内容的比较。换言之,操作符==检查两个对象是否指向相同的内存地址,而方法equals() 比较两个对象的值是否相同。

由上面的例子,补充一些知识点

  1. 如果类定义中没有重写方法equals() ,则默认使用这个类最近的父类的equals() 方法
  2. 当重写方法equals() 时,也要同时重写hashCode()方法。保证两个相等(equals() 方法结果为true)的对象,他们的哈希值也要相等(hashCode()返回相同的值)。为什么相等对象的哈希值要相同?这里我们举一个反例论证更加直观,假如两个相等对象的哈希值不同,在作为key放入HashMap结构中时,这两个相等的对象就会放入到不同的桶中,在某种意义上HashMap结构中存在key相等的两个对象。
上一篇下一篇

猜你喜欢

热点阅读