1.HashMap参数:
DEFAULT_INITIAL_CAPACITY 默认大小为16
DEFAULT_LOAD_FACTOR 加载因子,默认为0.75
2.HashMap扩容机制
1.size > (DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR) = 12,默认情况下,当map容量大于12的情况下进行扩容。每次扩容为当前集合大小的2倍。
2.遍历链表数组(Node<K,V>[] node = null;),获取到key值,根据key值和新数组大小重新计算index下标位置,根据index存储到新的链表数组内。循环链表节点,计算index进行存储到新的数组内,直到nextNode为null。
3.put(key,value);
1.根据key计算hash值,确定下标位置。
2.根据下标获取Node<K,V>对象,如果为空,说明没有发生hash碰撞,直接添加到该下标位置。
插入key为B的数据
3.如果Node<K,V>对象不为空,说明发生了hash碰撞问题。
a.判断两个key的值是否相同,如果相同,说明是同一个key,新的value覆盖旧的value。size++
插入Key为A的值,value为a1。原A的值为a。
b.两个key的值如果不相同,添加该对象,并且新值的next节点指向旧的值。size++
插入Key为C的值,value为c
4.get(key);
1.根据key和链表数组大小计算index。
2.根据index获取到链表数组内的值。
3.比较key的equals值,如果比较不到,取该值的下个节点进行判断。直到nextNode为null结束。
4.根据key值获取到对应的value。
5.remove(key);
1.根据key和链表数组大小计算index。
2.根据index获取到链表数组内的值。
3.比较两个key的值,如果相同size--
a.如果是头结点,直接把该节点的下个节点变为头结点。table[index]=first.nextNode;
b.如果不是头结点,将该节点的上个节点的nextNode赋值给该节点的下个节点