前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HashMap和HashTable区别

HashMap和HashTable区别

作者头像
@派大星
发布2023-06-27 17:09:26
920
发布2023-06-27 17:09:26
举报
文章被收录于专栏:码上遇见你码上遇见你

概要

- HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口

- 主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于HashTable

- HashMap允许将null作为一个entry的key或者value,而Hashtable不允许

- 最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是

hashMap出现线程不安全的表现:

1多个线程同时操作一个hashmap就可能出现不安全的情况:

比如A B两个线程(A线程获数据 B线程存数据) 同时操作myHashMap

1.B线程执行存放数据

modelHashMap.put("1","2");

2.A线程执行get获取数据

modelHashMap.get("1")

A线程获取的值本来应该是2,但是如果A线程在刚到达获取的动作还没执行的时候,

线程执行的机会又跳到线程B,此时线程B又对modelHashMap赋值 如:modelHashMap.put("1","3");

然后线程虚拟机又执行线程A,A取到的值为3,这样map中第一个存放的值 就会丢失要保证值的准确,就要保证操作的原子性,就是保证A操作从头开始不能被打断。所有要用同步关键字,或者使用java 1.5中的current新包中的ConcurrentHashMap,这是线程安全的,在java最新的并发包中,对之前非线程安全的工具,如hashMap List 都做了同步封转。

2

一般我们声明HashMap时,使用的都是默认的构造方法:HashMap<K,V>,看了代码你会发现,它还有其它的构造方法:HashMap(int initialCapacity, float loadFactor),其中参数initialCapacity为初始容量,loadFactor为加载因子,而之前我们看到的threshold = (int)(capacity * loadFactor); 如果在默认情况下,一个HashMap的容量为16,加载因子为0.75,那么阀值就是12,所以在往HashMap中put的值到达12时,它将自动扩容两倍,如果两个线程同时遇到HashMap的大小达到12的倍数时,就很有可能会出现在将oldTable转移到newTable的过程中遇到问题,从而导致最终的HashMap的值存储异常。

3

构造entry<K,V>单链表时,也会出现不安全的情况

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码上遇见你 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • hashMap出现线程不安全的表现:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档