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()
。
案例场景
参考: