HashMap和HashTable的区别(面试)

HashMap和HashTable区别

  1. 底层结构:
    • HashMap(1.8)采用的是:数组+链表+红黑树
    • HashTable采用的是:数组+链表
  2. 安全性:
    • HashMap不是线程安全的
    • HashTable是线程安全的(方法中加上了synchronized)
  3. 是否可以null值
    • HashMap的k只能一个null,value可以为多个null
    • HashTable的k-v都不能出现null
  4. 加载方式
    • HashMap是饿汉式(无参new时,创建的时null的数组)
    • HashTable是饿汉式(无参new时,直接创建数组容量11)
  5. 数组底层类型不同
    • HashMap底层数组类型是:HashMap$Node
    • HashTable底层数组类型是:HashTable&Entry
    • 扩容因子都是:0.75
  6. 扩容
    • HashMap:第一次数组是16(懒汉式),扩容是2倍
    • HashTable:第一次数组容量是11(饿汉式),扩容是(2*N+1)
  7. 效率:
    • HashMap效率高
    • HashTable效率低(因为使用了同步锁)
  8. 带参初始化:
    • HashMap初始化时,底层数组(桶)必须是2的幂次方——这与底层数组定位有关
    • Hashtable初始时,底层数组(桶)不用2的幂次方——采用的时取模的方式

    这与底层key的定位算法有关:
    1.HashMap元素定位:计算key的hash,再利用key的hash与数组长度-1(length-1)进行按位与操作,因此数组长度需要是2的幂次方
    2.HashTable元素定位采用的是 (e.hash & 0x7FFFFFFF) % newCapacity,简单理解就是取模操作,因此不需要2的幂次方

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值