我们为什么需要HashMap与HashTable?
HashMap采用哈希算法实现,是Map接口最常用的实现类。 由于底层采用了哈希表存储数据,要求键不能重复,如果发生重复,新的键值对会替换旧的键值对。 HashMap在查找、删除、修改方面都有非常高的效率,在开发中使用广泛。
HashTable类和HashMap用法几乎一样,底层实现几乎一样,只不过HashTable的方法添加了synchronized关键字确保线程同步检查,效率较低,在我们需要线程安全时,才会使用HashTable。
基本实现
在关于Map中,多次提到了“键(key)-值(value) 对”的概念,这也就是Map最基本的实现要点。其实键值对的结构,与单项链表的结构相似(《LinkedList》中使用的是双向链表),单个键(key)-值(value) 对的结构如下图,其中Hash是Key的hash值,Key用来存键,Value存值,Next用来指向下一个键值对:
当多个键值对形成链表时,上一个节点的next指向下一个节点,直至最后一个节点,最后一个节点的next置空。结构如下图:
然后HashMap中还定义了一个数组,默认容量为16个元素,每个元素都存着链表的第一个键值对,所以,HashMap的本质是“数组+链表”的结合使用。同一个链表上的Hash值是相同的,所以说数组存放的是链表。完整结构如下图:
了解HashMap的底层结构后,看看源码验证一下:
transient Node<K,V>[] table; // Node数组
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 数组默认容量16
//Node,键值对节点
static class Node