写在前面的话
最近参加了一些面试,总结了一些面试中没有回答出来,或者很有意思的问题.
1. 如果在HashMap中使用没有重写hashcode()方法的自定义对象会发生什么?
首先在回答这个问题之前要对HashMap的实现有所了解,HashMap的put()/get()/remove()方法都遵循以下原则:1234567891011// 只是表达插入的实现过程,与实际源码的实现有区别,查找和删除的过程也类似.int h = hash(obj.hashcode()) //对传入对象重hashint index = indexFor(lengh,h)//计算在桶中的位置if (table[index] == null ) { //如果桶中的位置为空就放入一个新节点 table[index] = newNode(obj);}else { ... //在链表或红黑树中查找是否存在新插入的元素 if (obj.equals(ele)) ... //存在就替换 else ...//否则在桶中链表中放上新节点}
从上面伪码可以看出,需要先调用对象hashcode方法计算在数组中的位置,如果这个位置为空则需调用对象的equals方法在数组的链表中是否存在该对象.
假如没有实现该对象的hashcode方法则默认调用Object类的hashcode方法,因为默认的hashcode方法会返回内存中的位置,那么即使是相同的对象(equals返回true)的hashcode也会不同,最终造成的结果是存到HashMap中的值永远也取不出,也删不掉.