1.HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,会自动增长。
2.HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的 ConcurrentHashMap。
3.HashMap 实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。
4.HashMap存数据的过程是:
HashMap内部维护了一个存储数据的Node数组,HashMap采用链表解决冲突,每一个Node本质上是一个单向链表。当准备添加一个key-value对时,首先通过hash(key)方法计算hash值,然后通过i = (table.length - 1) & hash求该key-value对的存储位置,这就保证每一个key-value对都能存入HashMap中,当计算出的位置相同时,由于存入位置是一个链表,则把这个key-value对插入链表头。
5.HashMap中key和value都允许为null。key为null的键值对永远都放在以table[0]为头结点的链表中。
transient Node<K,V>[] table;
static class Node<K,V> implements Map.Entry<K,V> {final int hash; final K key; V value; Node<K,V> next;
Node(int hash, K key, V value, Node<K,V> next) {
this.hash = hash;
this.key = key;
this.value = value;
this.next = next;
}}
6.HashMap扩容的条件是:当size大于threshold时,对HashMap进行扩容
而HashMap扩容时,将容量变为原来的2倍。
扩容是是新建了一个HashMap的底层数组,将就HashMap的全部元素添加到新的HashMap中(要重新计算元素在新的数组中的索引位置)。 很明显,扩容是一个相当耗时的操作