之前面试,有大量公司问了这个问题,坐标上海,所以这里记一下。
首先,HashMap使用的是 数组+链表 的数据结构进行存储。
HashMap在存储元素的时候,首先对key进行一个HashCode()方法,然后将这个元素存入到数组中,如果发现当前数组中已经有元素,即为hash冲突,此时会以数组中当前元素为首开辟一个链表,调用key的equals()方法将数据存入。
获取元素时,通过key的hashCode()方法可以找到元素存放在数组中的位置,如果发现存在多个元素(链表中),则调用key的equals方法找到具体的元素返回。
因为可能存在hash冲突,所以在重写hashcode方法时也最好重写equals方法。
对于数组中的每一个元素下的链表,它们的hashCode值一定是相同的。如果两个对象连hashCode都不相等,那这两个对象一定不等。即:
两个对象hashCode相等,equals相等,两个对象才相等;相反,两个对象相等,则hashCode和equals一定相等。
两个对象hashCode不相等,那不用比较equals了,两个对象一定不相等;而两个对象不相等,则hashCode可能相等,但equals一定不相等。