1.hashCode相等的两个对象一定相等嘛?相反呢?
- 两个hashcode值相同对象不一定相同,hash值不同两个对象一定步相同,碰撞的情况下可能会相同。
- 两个对象equals相同,hashCode值一定相同。
2.equals和hashCode的作用?
两者的作用其实都是一样的,在java里都是用来对比两个对象是否相等。
3.equals和hashCode的区别?
equals和hashCode方法主要的区别在于:性能,可靠性;
- equals方法:因为hashCode并不是完全可靠的,有时候不同的对象生成的hashCode也可能一样(生成hashCode值的公式可能存在问题),所以hashCode并不是完全可靠的,只能通过equals保证两个对象确实相等。
- hashCode方法:因为重写equals方法比较复杂,调用equals方法比较对象是否相等的效率比较低,而利用hashCode进行对比,只需要生成一个hash值进行比较就可以,效率较高。
- 实际应用:对于需要大量并且快速对比,如果都用equals比较效率太低,所以每当需要对象比较时,先用hashCode对比,如果hashCode值不一样,两对象肯定不相等,也就没必要再用equals比较,如果hashCode相等,再用equals对比,euqals相同则表示这两个对象确实相同,既提高了执行效率也保证了可靠性。
4.为什么重写equals一定要重写hashCode?
如果重写了equals方法,而没有重写hashCode方法,就会调用Object类中的hashCode方法,那么逻辑上相等的对象,hashCode却不一样,当你用其中的一个对象作为key保存到HashMap,HashSet,HashTable中,再将另一个“相等的”的对象作为key取值,可能会找不到该对象。
5.什么时候需要重写HashCode?
一般情况下判断两个对象是否相等时不需要重写hashCode,只有当类的对象需要作为HashMap,HashSet,HashTable的key时才需要重写hashCode。