首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

HashMap、HashTable、ConcurrentHashMap 区别

HashMap、HashTable、ConcurrentHashMap HashMap在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU 利用率接近100%。...HashTable使用synchronized来保证线程安全,但在激烈竞争情况下效率非常低下。...因为一个线程访问HashTable同步方法,其他线程也访问HashTable同步方法时,会进入阻塞或轮循状态。...HashTable在积累并发环境下表现出效率低下原因是所有访问HashTable线程都必须竞争同一把锁。...为了能通过位于散列算法来定位segment数组索引,必须保证Segment数组长度是2N次方,所以必须计算出一个大于或等于concurrencyLevel最小2N次方值来作为segment数组长度

34310
您找到你想要的搜索结果了吗?
是的
没有找到

HashMap 和Hashtable区别

作者:王兴 HashMap与Hashtable区别 HashMap与Hashtable区别是面试中经常遇到一个问题。这个问题看似简单,但如果深究进去,也能了解到不少知识。...虽然Hashtable比HashMap出现早一些,但是现在Hashtable基本上已经被弃用了。而HashMap已经成为应用最为广泛一种数据类型了。...造成这样原因一方面是因为Hashtable是线程安全,效率比较低。另一方面可能是因为Hashtable没有遵循驼峰命名法吧。。。 3....JDK8之前版本中,Hashtable是没有fast-fail机制。在JDK8及以后版本中 ,HashTable也是使用fast-fail, 源码如下: ?...也就是说Hashtable会尽量使用素数、奇数。而HashMap则总是使用2幂作为哈希表大小。 之所以会有这样不同,是因为Hashtable和HashMap设计时侧重点不同。

49620

HashTable和HashMap区别

HashTable 底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化...将组成一条Entry链,对Key查找需要遍历Entry链上每个元素执行equals()比较。...加载因子:为了降低哈希冲突概率,默认当HashMap中键值对达到数组大小75%时,即会触发扩容。因此,如果预估容量是100,即需要设定100/0.75=134数组大小。...(读操作不加锁,由于HashEntryvalue变量是 volatile,也能保证读取到最新值。)...Hashtablesynchronized是针对整张Hash表,即每次锁住整张表让线程独占,ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术 有些方法需要跨段

78400

HashMap 和 Hashtable 区别

HashMap 和 Hashtable 区别 线程是否安全: HashMap 是非线程安全HashTable 是线程安全,因为 HashTable 内部方法基本都经过synchronized...; 效率: 因为线程安全问题,HashMap 要比 HashTable 效率高一点。...另外,HashTable 基本被淘汰,不要在代码中使用它; 对 Null key 和 Null value 支持: HashMap 可以存储 null key 和 value,但 null 作为键只能有一个...初始容量大小和每次扩充容量大小不同 : ① 创建时如果不指定容量初始值,Hashtable 默认初始大小为 11,之后每次扩充,容量变为原来 2n+1。HashMap 默认初始化大小为 16。...② 创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定大小,而 HashMap 会将其扩充为 2 幂次方大小(HashMap 中tableSizeFor()方法保证,下面给出了源代码

83630

ConcurrentHashMap和HashTable区别

hashtable是做了同步,hashmap未考虑同步。所以hashmap在单线程情况下效率较高。hashtable多线程情况下,同步操作能保证程序执行正确性。...但是hashtable每次同步执行时候都要锁住整个结构。看下图: ? 图左侧清晰标注出来,lock每次都要锁住整个结构。 ConcurrentHashMap正是为了解决这个问题而诞生。...更令人惊讶是ConcurrentHashMap读取并发,因为在读取大多数时候都没有用到锁定,所以读取操作几乎是完全并发操作,而写操作锁定粒度又非常细,比起之前又更加快速(这一点在桶更多时表现得更明显些...完成后再将头指针替换为新数据,这样iterator线程可以使用原来老数据,而写线程也可以并发完成改变,更重要,这保证了多个线程并发执行连续性和扩展性,是性能提升关键。...这是因为修改操作时不能并发。 ? 同样,remove操作也是如此(类似put,一开始就锁住真个segment)。 ? 但要注意一点区别,中间那个for循环是做什么用呢?

76560

Hashtable 和 HashMap 区别

大家好,又见面了,我是你们朋友全栈君 Hashtable: (1)Hashtable 是一个散列表,它存储内容是键值对(key-value)映射。...(2)Hashtable 函数都是同步,这意味着它是线程安全。它key、value都不可以为null。 (3)HashTable直接使用对象hashCode。...HashMap: (1)由数组+链表组成,基于哈希表Map实现,数组是HashMap主体,链表则是主要为了解决哈希冲突而存在。...(2)不是线程安全,HashMap可以接受为null键(key)和值(value)。 (3)HashMap重新计算hash值 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。...如发现本站有涉嫌侵权/违法违规内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

19030

HashMap和Hashtable区别

HashMap与Hashtable都是java集合类,都可以用来存放java对象,这是他们相同点,但是他们也有区别: 一:历史原因: Hashtable是基于陈旧Dictionary类,HashMap...二:同步性 Hashtable 是同步,该类方法保证了,Hashtable对象是线程安全,而HashMap则是异步。...因此HashMap中对象并不是线程安全,因为同步要求会影响执行效率。...所以如果不需要线程安全集合,那么我们就要毫不犹豫使用HashMap,这样可以避免由于同步带来不必要性能开销,从而提高效率。...三:值 HashMap可以让你将空值null作为一个元素key或者value 但是Hashtable是不可以放入空值null。 最大区别就是同步性上差别。

29420

HashMap和HashTable区别

1、线程是否安全: HashMap是非线程安全HashTable是线程安全HashTable内部方法基本上都经过synchronized修饰。...(如果你要保保证线程安全监视使用ConcurrentHashMap); 2、效率: 因为线程安全问题,HashMap要比HashTable效率高一些,另外HashTable基本被淘汰,不建议在代码中使用...但是在HashTable中put进键值只要有一个null,直接抛出NullPointerException; 4、初始容量大小和每次扩容容量大小不同: 创建时如果不指定容量初始值,HashMap默认初始化大小为...HashTable默认初始大小为11,之后每次扩容,容量变为原来2n+1;创建时如果给定了容量初始值,那么HashTable会直接使用你给定大小,而HashMap会将其扩充为2幂次方大小;...HashTable没有这样机制;

20364

HashMap和HashTable区别

概要 - HashMap是Hashtable轻量级实现(非线程安全实现),他们都完成了Map接口 - 主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于HashTable...- HashMap允许将null作为一个entrykey或者value,而Hashtable不允许 - 最大不同是,Hashtable方法是Synchronize,而HashMap不是 hashMap...("1","2"); 2.A线程执行get获取数据 modelHashMap.get("1") A线程获取值本来应该是2,但是如果A线程在刚到达获取动作还没执行时候, 线程执行机会又跳到线程B,...所有要用同步关键字,或者使用java 1.5中current新包中ConcurrentHashMap,这是线程安全,在java最新并发包中,对之前非线程安全工具,如hashMap List 都做了同步封转...oldTable转移到newTable过程中遇到问题,从而导致最终HashMap值存储异常。

9210

HashMap、Hashtable、ConcurrentHashMap区别

HashMap是线程不安全,在多线程环境中,需要手动实现同步机制 ---- HashTable 底层数组+链表实现,无论key还是value都不能为null,线程安全(安全实现原理:修改数据时锁住整个...HashTable,效率低,ConcurrentHashMap做了相关优化) Hashtable是线程安全,它方法是同步,可以直接用在多线程环境中 ---- ConcurrentHashMap...从Java5开始,它是HashTable替代,比HashTable扩展性更好 ConcurrentHashMap是使用了锁分段技术来保证线程安全 ---- ConcurrentHashMap提供了与...Hashtable和SynchronizedMap不同锁机制。...Hashtable中采用锁机制是一次锁住整个hash表,从而在同一时刻只能由一个线程对其进行操作;而ConcurrentHashMap默认将hash表分为16个桶,一次锁住一个桶. ---- ConcurrentHashMap

41420

ConcurrentHashMap 和 Hashtable 区别

底层数据结构: JDK1.7 ConcurrentHashMap 底层采用 分段数组+链表 实现,而 JDK1.8 ConcurrentHashMap 实现跟 HashMap1.8 数据结构一样...Hashtable 和 JDK1.8 之前 HashMap 底层数据结构类似,都是采用 数组+链表 形式。...数组是 HashMap 主体,链表则是为了解决哈希冲突而存在; 实现线程安全方式: ① 在 JDK1.7 时候,ConcurrentHashMap(分段锁) 对整个桶数组进行了分割分段( Segment...锁做了很多优化) 整个看起来就像是优化过且线程安全 HashMap,虽然在 JDK1.8 中还能看到 Segment 数据结构,但是已经简化了属性,只是为了兼容旧版本;② Hashtable (...对比图: Hashtable ? Hashtable JDK1.7 ConcurrentHashMap ?

4.5K20

Hashtable和 Hashmap区别

在前面的一片文章写了HashMap源码阅读,这次来说一下HashTable一些知识。...在阅读源码过后,我发现HashMap与HashTable实现方式基本一致,因此这篇文章不再介绍HashTable中每个方法源码实现,知识列举两者区别与联系,有兴趣读者可以点击上面的链接去看一下HashMap...区别 1.HashTable不能存储空值,而HashMap可以。 ? 在HashTable源码中put()方法,开始就检查了存入值是否为空,如果为空则抛出了空指针异常。...2.HashTable是线程安全,而HashMap不是。 查看源码可以发现,HashTable中所有改变值得操作都使用了synchronized关键字修饰。...2.HashTable使用synchronized关键字来保证了线程安全性,但是在单线程使用环境下,会造成一定性能浪费,在使用前需要进行选择。 注意事项 1.可否让HashMap线程安全?

33920

HashMap 和 HashTable 区别

1、线程是否安全: HashMap 是非线程安全HashTable 是线程安全HashTable 内部方法基本都经过synchronized 修饰。...; 2、效率: 因为线程安全问题,HashMap 要比 HashTable 效率高一点。...另外,HashTable 基本被淘汰,不要在代码中使用它; 3、对Null key 和Null value支持: HashMap 中,null 可以作为键,这样键只有一个,可以有一个或多个键所对应值为...但是在 HashTable 中 put 进键值只要有一个 null,直接抛出 NullPointerException。...4、初始容量大小和每次扩充容量大小不同 : ①创建时如果不指定容量初始值,Hashtable 默认初始大小为11,之后每次扩充,容量变为原来2n+1。HashMap 默认初始化大小为16。

53110

HashMap 和 Hashtable 区别

线程安全: HashMap 是非线程安全,而 Hashtable 是线程安全,因为 Hashtable 内部方法,基本都经过 synchronized 修饰(如果要确保线程安全,建议使用 ConcurrentHashMap...); 执行效率: 因为线程安全原因,HashMap 要比 Hashtable 效率高;此外,由于 Hashtable 基本被淘汰,最好不要在项目中使用它; 对 Null key 和 Null value...支持: HashMap 中,null 可以作为键,这样键最多可以有一个,但可以有一个或多个键所对应值为 null;在 Hashtable 中,键和值都不能为 null,否则会直接抛出 NullPointerException...; 初始容量大小和扩容机制不同 : ① 创建时,如果未指定容量初始值,Hashtable 默认初始大小为11,之后每次扩充,容量变为原来 2n+1;HashMap 默认初始大小为16,之后每次扩充...,容量变为原来2倍; ② 创建时,如果给定了容量初始值,Hashtable 将直接使用给定大小作为初始容量;而 HashMap 会将其扩充为2幂次方大小,也就是说, HashMap 总是使用2幂作为哈希表大小

45120

HashMap与Hashtable区别

它们主要区别: 1、线程安全性 Hashtable是线程安全,它每一个方法都是同步(synchronize)。...在多线程中我们可以直接使用Hashtable,多个线程可以共享Hashtable,而不需要我们来给它创建同步; HashMap不是线程安全,在多线程状态下,可能会产生死锁状态,当然你也可以自己创建同步...3、对外提供方法 Hashtable比HashMap多提供 elments() 和 contains() 两个方法。...4、容量 Hashtable初始容量为11,每次扩充容量会变成原来两倍+1; HashMap初始容量为16,每次扩充容量会变成原来两倍。...5、迭代器 HashMap迭代器(Iterator)是fail-fast迭代器,而Hashtableenumerator迭代器不是fail-fast

28420
领券