HashMap 和 HashTable 的区别?

以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;

    // 树转化
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder.Ren

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值