在JDK1,.8之前:
HashMap底层采用的是数组加链表也就是链表散列的方式来实现的。数组是HashMap的主体,而链表是为了解决冲突而存在的。HashMap通过key的hashcode值,然后再经过hash函数,得到当前元素要存放的位置。接下来判断该位置是否存在元素,如果存在元素,就判断hash值和key值是否相同,如果相同的话,就直接覆盖。如果不相同,就采用拉链法来解决冲突。
所谓的拉链法就是将数组和链表结合在一起。每次有冲突的话,就将元素放到冲突的链表当中。
JDK1.8之后:
HashMap底层发生了比较大的变化,采用的是红黑树。当链表的长度大于阈值(一般设置为8),就将链表转化成红黑树,减少搜索的时间。