hash表和equals方法

在面试中,经常会被问及什么是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不等都不成立。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值