Java equals(),== 和 hashcode()

首先来看看equals() 和 "==" 的关系

1.在Java中==是用来比较两个对象的内存地址是否相同的,如果是基本类型的话将会比较其值。
2.equals()我们如果使用的是没有重新的方法的话是==是一样的,但是很多时候我们使用的都是重写了的方法。
equals()在Object类中,其源码如下,可以看出是就是使用了==

Object equals()
public boolean equals(Object object){
 return (this ==object );
}

但比如我们经常使用equals()进行字符串的比较,在String类中,其源码如下,可以看出是如何比较两个字符串的值是否相同的:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

接下来了解下hashcode()

hashcode()的作用是获取哈希码,其也是在Object类中的,JDK调用了native方法进行获取,原理就是输入任意长度都会输出固定长的一个内容,但是不同的输入可能存在相同的输出,也就时对象不同哈希可能相同,但是的哈希码不同对象一定不同,也就是产生碰撞了,如果是MD5的算法的话也是类似,但是不同的输入输出是不同的。获取的哈希码是按键值对(key,value)进行存储的。

要之何用?

我们知道Set集合具有元素唯一性的特点,但它是如何保证其唯一的呢?
我们将一个对象存入Set时,会先获取对象的哈希码,然后与Set中的对象进行比较,如果相同的就说明其内已经有这个对象了,就不添加进集合,但是如果不同的话,也并不是说没有这个对象,然后会调用equals()进行比较,如果相同的话,还是不进行添加,如此好像没有很大作用,但是其目的是提高比较的效率,减少使用equals()

案例场景

参考:

posted @ 2020-07-15 15:52  会飞的一棵树  阅读(168)  评论(0编辑  收藏  举报