在面试中,经常会被问及什么是hash表、有什么用?以及如何实现两个对象相等的判断?
网上百度了一下,下面分别就上述两个问题做个归纳:
1、首先看看关于hash的百度词条:http://baike.baidu.com/view/329976.htm?fr=ala0
总结:哈希表又称散列表,是根据关键码-值(key-value)而直接进行访问的数据结构。也就是说,它通过把关键码-值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数,存放记录的数组叫做哈希表。 哈希表不可避免冲突(collision)现象:对不同的关键字可能得到同一哈希地址 即key1≠key2,而hash(key1)=hash(key2)。具有相同函数值的关键字对该哈希函数来说称为同义词(synonym)。 因此,在建造哈希表时不仅要设定一个好的哈希函数,而且要设定一种处理冲突的方法。可如下描述哈希表:根据设定的哈希函数H(key)和所选中的处理冲突的方法,将一组关键码映象到一个有限的、地址连续的地址集(区间)上并以关键码在地址集中的“象”作为相应记录在表中的存储位置,这种表被称为哈希表。常用的构造哈希函数的方法;处理冲突的方法;用途:MD5加密-文件校验、数字签名、解决冲突问题等。哈希算法是将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值,哈希值是一段数据唯一且极其紧凑的数值表示形式。
2、再看看equals方法相关的:
http://tech.ddvip.com/2007-06/118224710327804.html
http://www.blogjava.net/xiexin80/archive/2008/12/06/244730.html
http://achievo-bruce-126-com.javaeye.com/blog/219942
总结:equals()是对象相等性比较,hashCode()是计算对象的散列值,依据是对象的属性。
对于equals,一般我们认为两个对象同类型并且所有属性相等的时候才是相等的,在类中必须改写equals,因为Object类中的
equals只是判断两个引用变量是否引用同一对象,可参考:
http://blog.csdn.net/wlp2003/archive/2010/08/18/5822539.aspx
Object的equals源码实现:
public boolean equals(Object obj) {
return (this == obj);
}
所以要比较两个对象是否相等,一定要重写其equals方法,如String类。
对于hashCode,主要是用在和哈希运算有关的地方。如果两个对象是equal的话,则hashCode必须相同。
以下摘自网络的观点供参考:从语法角度,hashCode和equals是两个独立的,互不隶属互不依赖的方法。但从为了让我们的程序正常运行的角度,我们应当向Effective Java中所言重载equals的时候,一定要(正确)重载hashCode使得equals成立的时候,hashCode相等,也就是a.equals(b)-> a.hashCode() == b.hashCode(),或者说此时,equals是hashCode相等的充分条件,hashCode相等是equals的必要条件(从数学课上我们知道它的逆否命题:hashCode不相等也不会equals),但是它的逆命题:hashCode相等一定equals以及否命题不equals时hashCode不等都不成立。