Java,哈希码以及equals和==的区别

    从开始学习Java,哈希码以及equals和==的区别就一直困扰着我。 要想明白equals和==的区别首先应该了解什么是哈希码,由于在jdk的类库中无论是object实现的equals()方法仍是String重写的equals()方法以及
其它基本数据类型的包装类重写的euqals()方法,他们在比较对象的时候都是根据hashCode()方法返回的哈希码来判断两个对象是否相等的,因此要想搞清楚
equals()就必需要知道什么是哈希码。 那么到底是什么哈希码呢?哈希码是能够根据的本身的需求,采用不一样的算法产生的一个Int型数字。Object的hashCode()方法返回的哈希码是根据对
象的内存地址来生成的,因此每一个对象的哈希码是不相同的,若是你要比较的两个变量的类型没有重写Object的hashCode()方法那么这两个变量除非是指向
相同的对象(地址相同),不然返回的必定是false。而String以及基本数据类型的包装类中都重写了hashCode()方法,他们生成的哈希码是跟他们的内容
(这里就是指值)息息相关,也就是说在用equals()比较两个变量是否相等的时候只要他们的值相等,那么就返回true,由于他们生成的哈希码相等。有个
值得注意的地方是:在JDK的类中只要重写的Object的equals()方法,那就确定重写了它的hashCode()方法,由于equals()方法中在比较两个变量时,
判断的标准就是哈希码是否同样,Object中的hashCode()方法是根据对象的内存地址生成的,若是重写了equals()方法而继续使用原来的hashCode()方
法生成的哈希码做为判断相等的依据,那显然达不到咱们要改变判断对象是否相等的标准的效果。 既然知道了什么是哈希码,如今就能够说明equals()和
==的区别了,对于没用重写Object的equals()方法的类型所生成的对象的比较,equals()

和==是效果同样的,==比较的是两个变量所指向的对象在内存中指向的地址是否同样,而当两个变量的类型中继承了Object的equals()方法的时候,因为
该方法比较的标准是看哈希码是否相等,而哈希码是由hashCode()方法生成的,该方法生成哈希码的依据是对象在内存中的地址,最终比较的仍是地址。所
以说equals()和==效果同样。而对于像String和那些基本数据类型的包装类来讲equals()和==就不同了,由于他们重写了Object的equals()方法和
hashCode()方法,使得equals()方法的判断标准发生了改变,他们的判断标准是看对象的内容是否相等,这里就是指值是否是同样,由于他们的哈希码是
根据对象的值生成的,与内存地址无关了,因此他们的equals()方法比较的是对象的值是否相等,而==比较的仍然是地址。因此equals()和==就不同了。 这里还要注意一下,在比较值的时候,通常==比较的是基本数据类型,而equals()比较的是引用数据类型,地址相同必定值相等,而值相等地址不必定
相同。若是比较的是地址,那最好是用==,由于不管是否重写了Object的equals()方法,==永远比较的是地址,equals()比较的是哈希码,而哈希码生成
的标准是由类做者本身根据需求来控制的。
相关文章
相关标签/搜索