JAVA中为什么两个不同的对象hashCode有可能会相同? 20
2019-05-09
展开全部
你说的那两种 都有可能相同
所以hashCode()是不可靠的!
那它不可靠为什么还要用它?因为它计算起来快啊!
这涉及到两个对象之间的比较
1.equals()相等的两个对象他们的hashCode()肯定相等,也就是用equals()对比是绝对可靠的。
2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。
再来看为什么用hashCode()
如果现在有大量的对象需要比较,每个都用equals() 效率是很低的,但hashCode()效率很高
所以有这种设计:先用hashCode()判断,如果hashCode()不同,则对象不等,如果hashCode()相同,再比较equals() ,大大提高了效率
你会说,啊那不对啊 如果我重写了equals(),不重写hashCode()不就会出错吗?
是的,所以我们要保证如果重写了equals(),也要重写hashCode()
所以hashCode()是不可靠的!
那它不可靠为什么还要用它?因为它计算起来快啊!
这涉及到两个对象之间的比较
1.equals()相等的两个对象他们的hashCode()肯定相等,也就是用equals()对比是绝对可靠的。
2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。
再来看为什么用hashCode()
如果现在有大量的对象需要比较,每个都用equals() 效率是很低的,但hashCode()效率很高
所以有这种设计:先用hashCode()判断,如果hashCode()不同,则对象不等,如果hashCode()相同,再比较equals() ,大大提高了效率
你会说,啊那不对啊 如果我重写了equals(),不重写hashCode()不就会出错吗?
是的,所以我们要保证如果重写了equals(),也要重写hashCode()
追问
我主要是问为什么会产生相同hashCode吗?
追答
输入数据长度不固定,而输出的哈希值却是固定长度的,这意味着哈希值是一个有限集合,而输入数据则可以是无穷多个,那么建立一对一关系明显是不现实的。所以“碰撞”是必然会发生的.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询