1、区别
(1)HashMap没有用synchronized修饰,HashTable使用了synchronized修饰;
(2)HashMap的键和值可以存储null,HashTable的键和值不允许。
2、HashMap的底层实现:数组加链表
JDK8开始链表长度大于8,数组长度大于64会转变成红黑树,元素以内部类Node节点存在。
(1)计算key的哈希值,二次哈希值后根据数组长度取模,对应到数组下标;
(2)如果没有产生冲突(数组下标没有存入数据),直接将数组存储进去;
(3)如果产生哈希冲突,先用equale对比,如果是相同的key直接取代;否则判断链表高度插入链表中。当链表高度大于8,数组长度大于64时会转换成红黑树;当链表长度低于6时由红黑树转换成链表。
3、扩容
扩容机制跟ArrayList类似,创建新数组,并将老数组中的数组复制到新数组中。