UML结构图

从这个图中我们可以看到:HashMap和HashTable都实现了Map接口,但是HashMap继承了AbstractMap,而HashTable继承了Dictionary类。其实HashMap还有一个内部类Node,Node实现了Map.Entry<K,V>,HashMap存储的每一个节点都是一个Node对象。
区别
| HashMap | 线程安不全 | 允许有null的键和值 | 效率相对高 | 方法不是synchronized | Iterator 迭代器 | 有containsvalue和containsKey方法 | 底层是数组+链表 |
| HashTable | 线程安全 | 不允许有null的键和值 | 效率相对低 | 方法都是synchronized | Enumerator 迭代器 | 有contains方法 | 底层是数组+链表+红黑树 |
HashMap重要参数
// 默认容量 16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
// 最大容量 2^30
static final int MAXIMUM_CAPACITY = 1 << 30;
// 默认负载因子0.75,扩容容量=当前容量+当前容量*0.75
static final float DEFAULT_LOAD_FACTOR = 0.75f;
// 将链表转换为红黑树的阈值
static final int TREEIFY_THRESHOLD = 8;
// 将红黑树变为链表的阈值
static final int UNTREEIFY_THRESHOLD = 6;
// 变为红黑树的最小容量
static final int MIN_TREEIFY_CAPACITY = 64;
jdk1.7和1.8的对比


本文详细对比了HashMap和HashTable在Java中的实现差异,包括线程安全性、null键值支持、效率、迭代器类型及底层数据结构。同时介绍了HashMap的重要参数,如默认容量、最大容量、默认负载因子等。
447





