HashMap、Hashtable区别

前几篇文章,我们分别探究了HashMap,Hashtable,这篇文章我们来分析一下 他们之间的区别
Collections.synchronizedMap(),生成的 SynchronizedMap的区别,查看源码我们可以发现 SynchronizedMap 只是对对应Map实现的一个封装,只是添加了对象锁,但是不像Hashtable 锁住当前的对象,SynchronizedMap 锁住的是当前的包装类访问限制,内部的Map 类开放的,也就是说如果获取到对应的 Iterator,可以再对其进行put, remove 操作。

第一:线程安全性(大家熟知的)

HashMap → 线程不安全
Hashtable → 线程安全,使用 synchronized 修饰方法,锁住对象,达到线程安全
SynchronizedMap → 严格线程安全,所有的方法都添加了synchronized 对象锁

第二:Null数据存储不同

HashMap → 可以存储null数据(key,value 都可以为null)而且key == null 数据只能存放一条
Hashtable → 严格控制,不能存储null数据(key,value 都不可以为 null)

第三:使用的存储结构不同

HashMap → 数组 + 链表 + 红黑树
Hashtable → 数组 + 链表

第四:使用的散列算法不同(碰撞率我们下次来分析)
HashMap → 采用hashCode 向右移位 16位,然后 异或运算,再 对数组长度 - 1 做 & 位运算
  hash = (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
  index = hash & (tab.length - 1) 
Hashtable → 采用 对数组长度 做 % 运算
   hash = key.hashCode()
   int index = (hash & 0x7FFFFFFF) % tab.length 
第五:使用的扩容算法不同
HashMap → 数组长度,容量都是原来的 2 倍
  newCapacity = oldCapacity << 1
  newThreshold  = oldThreshold  << 1
Hashtable → 数组长度是原来的 2倍 + 1,容量是 新的数组长度 * 0.75
  newCapacity = (oldCapacity << 1) + 1
  threshold = (int)Math.min(newCapacity * loadFactor, MAX_ARRAY_SIZE + 1)
第六:链表插入数据的位置不同

HashMap → 链表的结尾插入数据
Hashtable → 链表的开始插入数据

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 这次我和大家一起学习HashMap,HashMap我们在工作中经常会使用,而且面试中也很频繁会问到,因为它里...
    liangzzz阅读 8,021评论 7 102
  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 4,435评论 1 14
  • HashMap 是 Java 面试必考的知识点,面试官从这个小知识点就可以了解我们对 Java 基础的掌握程度。网...
    野狗子嗷嗷嗷阅读 6,686评论 9 107
  • 我自己是一个对时间概念特别不敏感的人,而且拖延症很严重!虽然清楚自己的问题症结所在,但是总找不到合适的方法(...
    离井的蛙阅读 358评论 0 1
  • 在进行css布局中,经常会使用到权重,那么权重是什么意思呢? css的权重的顺序为: important > 内联...
    博为峰51Code教研组阅读 1,080评论 0 0