一些容易忽视的细节总结(一)

写在前面的话

最近参加了一些面试,总结了一些面试中没有回答出来,或者很有意思的问题.

1. 如果在HashMap中使用没有重写hashcode()方法的自定义对象会发生什么?

首先在回答这个问题之前要对HashMap的实现有所了解,HashMap的put()/get()/remove()方法都遵循以下原则:

1
2
3
4
5
6
7
8
9
10
11
// 只是表达插入的实现过程,与实际源码的实现有区别,查找和删除的过程也类似.
int h = hash(obj.hashcode()) //对传入对象重hash
int 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中的值永远也取不出,也删不掉.

2. 待续

坚持原创技术分享,您的支持将鼓励我继续创作!