Hash,HashCode,Equals

Hash:任意长度的输入通过散列函数(hash函数)转化为固定长度的输出(散列值),散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。hash函数是实现功能的一类算法函数。hash表是所有的散列值的组成。

HashCode:hashcode是对象的物理地址通过hash函数得到的一个整数值。为什么不直接使用物理地址?hashcode存在的目的是为了查找的快捷性,如果我们存1000个对象,如果我们要找其中某个对象排号999,那么我们要和其他998个对象比较才可能找到。这个就是物理地址查找。因为散列值的空间通常远小于输入的空间,所以hashcode的产生的那个整数值可能对应着多个对象,这里也将提高效率,然后我们需要再使用equals方法进一步的比较那个整数值相同的对象,才会判断出对象是不是相同的。先进行HashCode比较,如果不同,则不需要进行equals比较了,也可以减少比较次数,提高效率。

所以:两个对象的equals相同,那么这两个对象的hashcode一定相同。两个hashcode相同,则两个对象不一定相同,equals返回false。

Equals是根据两个对象的值,判断是否相等的。

为什么equals方法重写的话,建议hashcode方法也重写?

如果A类和B类重写了equals方法,不重写hashcode,A类对象和B类对象在存储散列集合时(HashSet),会判断HashCode的值一样不,将会存储两个值一样(没有关系)的对象。这将产生混淆。

猜你喜欢

转载自blog.csdn.net/sinat_35049039/article/details/82120189