HashMap中,如果要比较key是否相等,要同时使用这两个函数。因为自定义的类的hashcode()方法继承于Object类,其hashcode码为默认的内存地址,这样即便有相同含义的两个对象,比较也是不相等的。
HashMap中的比较key是这样的:
- 先求出key的hashcode(),比较其值是否相等,若相等再比较equals(),若都相等则认为他们是相等的。若equals()不相等则认为他们不相等。
- 如果只重写hashcode()不重写equals()方法,当比较equals()时只是看他们是否为同一对象(即进行内存地址的比较),所以必定要两个方法一起重写。
- HashMap用来判断key是否相等的方法,其实是调用了HashSet判断加入元素 是否相等。重载hashCode()是为了对同一个key,能得到相同的Hash Code,这样HashMap就可以定位到我们指定的key上。
- 重载equals()是为了向HashMap表明当前对象和key上所保存的对象是相等的,这样我们才真正地获得了这个key所对应的这个键值对。
如果两个对象相同(即equals返回true) ,hashcode一定相等;但是hashcod相等时,两个对象却不一定equals 2、由于为了提高程序的执行效率才实现了hashcode方法,先进行hashcode比较,如果不同,就没有必要进行equals比较了,这样就大大的减少了equals的使用次数,从而效率得到提高