HashMap是一个key-value集合,结合了数组和链表的优势,提供快速查询、新增、修改map节点的功能数组
橙色是一个数组,每一个数组关联一个Entry链表。
下面是一个entry的数据结构,包含hash值,key,value和指向下一个entry的连接安全
hash | key | value | next |
添加元素put:先对key进行hash,根据hash值定位到数组下标(每一个数组元素对应的是一个entry链表),若是无元素则成为第一个元素,若是有元素则循环链表,有key相同的entry则覆盖,没有则将新元素放在链表头,并指向原来的第一个元素
查找元素get:先对key进行hash,根据hash值定位到数组下标,而后循环链表,找到key相同的entry并返回value数据结构
步骤四种put时,若是新增entry定位的数组下标已有元素就发生hash碰撞,由于最好的分配是每一个数组元素只包含一个entry,这样时间复杂度就是O(1),若是包含多个元素,查找的时候就须要循环链表,时间复杂度就是O(n)线程
不是,若是多个线程同时put元素,key相同的时候,可能会发生后面的put覆盖前面的key。3d
HashMap容许key、value都为null,null会存放在索引为0的数组中blog