总结一下java中我认识的哈希码以及equals和==的区别
2013-05-08 14:58
197 查看
从开始学习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()比较的是哈希码,而哈希码生成的标准是由类作者自己根据需求来控制的。
相关文章推荐
- Rhyme/Java getClass()与instanceof的区别以及如何编写一个完美的equals()
- Java中==与equals()以及hashCode()的区别
- 【Java基础】equals和==的区别以及Integer(-128~127)值的==和equals比较
- Java中路径的获取总结以及URL和URI的区别
- Java:比较运算符compareTo()、equals()、==之间的区别与应用总结
- java中的栈、堆以及equals和==的区别
- java核心API之String,StringBuffer和StringBuilder以及equals与==的区别和联系
- java.io 序列化 总结Serializable 和 Externalizable 的区别与联系,以及输出后的乱码问题
- java中 == 和 equals 的区别 以及equals源码查看和内存分析
- java中equals和==区别和总结。
- java关于equals与==号的区别以及与hashCode的关系
- Java中数据存储在哪?以及equals和==的区别
- Java equals 方法以及和 ==的区别
- Equals 和==的区别 公共变量和属性的区别 总结一下……
- java基础之 “==”和“ equals”以及instanceof的区别
- Java基础回顾--java IO流相关的类的分类和总结 3 【Java File类中list()、listFiles()的使用及区别,认识和使用匿名内部类】
- Java:比较运算符compareTo()、equals()、==之间的区别与应用总结 .
- java中“”和null的区别以及==和equals的区别
- Java基础之hashCode()的作用,以及==、equals()和hashCode()区别
- Java中的String str="abc"; String str=new String("abc");和String str = new String();的区别以及==与equals()的不同。