以jdk1.8为例:
- HashMap 是线程不安全的,HashTable 是线程安全的,大部分的方法都是用sychronized修饰加锁了。
- HashMap 的底层实现是 Node数组+链表+红黑树 的结构,Node数组长度小于64的时候,链表不会转化为红黑树,只会对数组进行扩容。HashTable的底层实现是Map.Entry的数组。
- HashMap 的默认容量是16,每次扩容容量扩充一倍。HashTable的默认容量是11,每次扩充容量扩容为2n+1。
- HashMap 的key和value的值都可以为null,key的值只能有一个为null,value的值可以有多个为null。HashTable的key和value不能为null,为null会报NullPointerException。
- HashMap计算hash值时使用了高位和低位异或计算的混合扰动处理减少hash冲突,HashTable没有这种处理,直接取的key的hashCode值。
HashMap相关代码:
// 默认容量是16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
// 最大容量,如果隐式指定了一个更高的值,则使用该值通过任何一个带参数的构造函数
// 必须是2的幂
static final int MAXIMUM_CAPACITY = 1 << 30;
// 负载因子
static final float DEFAULT_LOAD_FACTOR = 0.75f;
// 链表转化为树的阈值(必须大于2,且最少是8)
static final int TREEIFY_THRESHOLD = 8;
// 树转化

最低0.47元/天 解锁文章
8187

被折叠的 条评论
为什么被折叠?



