区别:
- HashMap中允许存在null的键和值,但HashTable不允许
- HashTable中每个方法都有synchronized修饰,所以HashTable是线程安全的,而HashMap不是。但多线程情况下仍然不建议使用HashTable,而是使用CurrnetHashMap,因为HashTable效率低,CurrnetHashMap是采用分段锁的,效率比HashTable高。
实现原理:数组+链表实现
Map中维护的是Entry数组。Map刚声明时为null,对其进行put时才初始化数组大小,默认为16。
当put新元素时,根据key计算出对应的hash值然后二次hash算出对应数组下标。数组的每个元素是一个链表的头指针,用来存储具有相同下标的Entry。
key为null,存在下标为0的位置。
jkd8开始,链表高度达到8,数组长度超过64链表转为红黑树,元素以内部类Node节点存在。