HashMap加入了红黑树 Hashtable 是不允许键或值为 null 的,HashMap 的键值则都可以为 null。...添加key-value的hash值算法不同:HashMap添加元素时,是使用自定义的哈希算法,而HashTable是直接采用key的hashCode() 实现方式不同:Hashtable 继承的是 Dictionary...迭代器,而Hashtable的enumerator迭代器不是fail-fast的。...但这并不是一个一定发生的行为,要看JVM。而Hashtable 则不会。...多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。
作者:王兴 HashMap与Hashtable的区别 HashMap与Hashtable的区别是面试中经常遇到的一个问题。这个问题看似简单,但如果深究进去,也能了解到不少知识。...虽然Hashtable比HashMap出现的早一些,但是现在Hashtable基本上已经被弃用了。而HashMap已经成为应用最为广泛的一种数据类型了。...造成这样的原因一方面是因为Hashtable是线程安全的,效率比较低。另一方面可能是因为Hashtable没有遵循驼峰命名法吧。。。 3....JDK8之前的版本中,Hashtable是没有fast-fail机制的。在JDK8及以后的版本中 ,HashTable也是使用fast-fail的, 源码如下: ?...也就是说Hashtable会尽量使用素数、奇数。而HashMap则总是使用2的幂作为哈希表的大小。 之所以会有这样的不同,是因为Hashtable和HashMap设计时的侧重点不同。
HashMap、HashTable、ConcurrentHashMap HashMap在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU 利用率接近100%。...HashTable使用synchronized来保证线程安全,但在激烈竞争的情况下效率非常低下。...因为一个线程访问HashTable的同步方法,其他线程也访问HashTable的同步方法时,会进入阻塞或轮循状态。...HashTable在积累并发的环境下表现出效率低下的原因是所有访问HashTable的线程都必须竞争同一把锁。...为了能通过位于散列算法来定位segment数组的索引,必须保证Segment数组的长度是2的N次方,所以必须计算出一个大于或等于concurrencyLevel的最小的2的N次方值来作为segment数组的长度
hashtable是做了同步的,hashmap未考虑同步。所以hashmap在单线程情况下效率较高。hashtable在的多线程情况下,同步操作能保证程序执行的正确性。...但是hashtable每次同步执行的时候都要锁住整个结构。看下图: ? 图左侧清晰的标注出来,lock每次都要锁住整个结构。 ConcurrentHashMap正是为了解决这个问题而诞生的。...更令人惊讶的是ConcurrentHashMap的读取并发,因为在读取的大多数时候都没有用到锁定,所以读取操作几乎是完全的并发操作,而写操作锁定的粒度又非常细,比起之前又更加快速(这一点在桶更多时表现得更明显些...完成后再将头指针替换为新的数据,这样iterator线程可以使用原来老的数据,而写线程也可以并发的完成改变,更重要的,这保证了多个线程并发执行的连续性和扩展性,是性能提升的关键。...这是因为修改操作时不能并发的。 ? 同样,remove操作也是如此(类似put,一开始就锁住真个segment)。 ? 但要注意一点区别,中间那个for循环是做什么用的呢?
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()方法保证,下面给出了源代码
HashTable 底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化...将组成一条Entry链,对Key的查找需要遍历Entry链上的每个元素执行equals()比较。...加载因子:为了降低哈希冲突的概率,默认当HashMap中的键值对达到数组大小的75%时,即会触发扩容。因此,如果预估容量是100,即需要设定100/0.75=134的数组大小。...(读操作不加锁,由于HashEntry的value变量是 volatile的,也能保证读取到最新的值。)...Hashtable的synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术 有些方法需要跨段
大家好,又见面了,我是你们的朋友全栈君 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值 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
HashMap与Hashtable都是java的集合类,都可以用来存放java对象,这是他们的相同点,但是他们也有区别: 一:历史原因: Hashtable是基于陈旧的Dictionary类的,HashMap...二:同步性 Hashtable 是同步的,该类的方法保证了,Hashtable中的对象是线程安全的,而HashMap则是异步的。...因此HashMap中的对象并不是线程安全的,因为同步的要求会影响执行的效率。...所以如果不需要线程安全的集合,那么我们就要毫不犹豫的使用HashMap,这样可以避免由于同步带来的不必要的性能开销,从而提高效率。...三:值 HashMap可以让你将空值null作为一个元素的key或者value 但是Hashtable是不可以放入空值null的。 最大的区别就是同步性上的差别。
1、线程是否安全: HashMap是非线程安全的,HashTable是线程安全的;HashTable内部的方法基本上都经过synchronized修饰。...(如果你要保保证线程安全监视使用ConcurrentHashMap); 2、效率: 因为线程安全的问题,HashMap要比HashTable的效率高一些,另外HashTable基本被淘汰,不建议在代码中使用...但是在HashTable中put进的键值只要有一个null,直接抛出NullPointerException; 4、初始容量大小和每次扩容容量大小不同: 创建时如果不指定容量的初始值,HashMap默认的初始化大小为...HashTable默认的初始大小为11,之后每次扩容,容量变为原来的2n+1;创建时如果给定了容量的初始值,那么HashTable会直接使用你给定的大小,而HashMap会将其扩充为2的幂次方大小;...HashTable没有这样的机制;
HashMap是Hashtable的轻量级实现(非线程安全的实现)。 1、HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。...3、Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。 ...4、两者最主要的区别在于Hashtable是线程安全,而HashMap则非线程安全。...Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。 ...5、HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75。
这篇文章中,我们不仅将会看到HashMap和Hashtable的区别,还将看到它们之间的相似之处。...HashMap和Hashtable的区别 HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。...主要的区别有:线程安全性,同步(synchronization),以及速度。...另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。...但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。
概要 - HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口 - 主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于HashTable...- HashMap允许将null作为一个entry的key或者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的值存储异常。
AbstractMap implements Map 2.Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。...3.Hashtable中,key和value都不允许出现null值 在HashMap中键可以为null。...4.内部实现上不同,Hashtable和HashMap都用了Iterator。而由于历史原因,Hashtable还用了Enumeration的方法。...5.哈希值得使用不同,Hashtable直接使用对象的hashCode,而HashMap重新计算hash值。 6.Hashtable和HashMap它们两个内部实现方式的数组初始大小和扩容方式。...Hashtable中hash数组默认大小是11,增加方式是old*2+1,HashMap中hash数组的默认大小是16,而且一定是2的指数。
底层数据结构: 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 ?
在前面的一片文章写了HashMap的源码阅读,这次来说一下HashTable的一些知识。...在阅读源码过后,我发现HashMap与HashTable的实现方式基本一致,因此这篇文章不再介绍HashTable中每个方法的源码实现,知识列举两者的区别与联系,有兴趣的读者可以点击上面的链接去看一下HashMap...区别 1.HashTable不能存储空值,而HashMap可以。 ? 在HashTable的源码中put()方法,开始就检查了存入的值是否为空,如果为空则抛出了空指针异常。...2.HashTable是线程安全的,而HashMap不是。 查看源码可以发现,HashTable中所有改变值得操作都使用了synchronized关键字修饰。...2.HashTable使用synchronized关键字来保证了线程安全性,但是在单线程的使用环境下,会造成一定的性能浪费,在使用前需要进行选择。 注意事项 1.可否让HashMap线程安全?
HashMap是线程不安全的,在多线程环境中,需要手动实现同步机制 ---- HashTable 底层数组+链表实现,无论key还是value都不能为null,线程安全(安全的实现原理:修改数据时锁住整个...HashTable,效率低,ConcurrentHashMap做了相关优化) Hashtable是线程安全的,它的方法是同步的,可以直接用在多线程环境中 ---- ConcurrentHashMap...从Java5开始,它是HashTable的替代,比HashTable的扩展性更好 ConcurrentHashMap是使用了锁分段技术来保证线程安全的 ---- ConcurrentHashMap提供了与...Hashtable和SynchronizedMap不同的锁机制。...Hashtable中采用的锁机制是一次锁住整个hash表,从而在同一时刻只能由一个线程对其进行操作;而ConcurrentHashMap默认将hash表分为16个桶,一次锁住一个桶. ---- ConcurrentHashMap
Hashmap是新框架中用来取代hashtable的,所以肯定用的更多,那么两者有什么区别呢 Hashmap###是不同步的,###Hashtable###是同步的 类似Vector和arrayList...感兴趣的同学可以去找一下源码看看,除构造函数外,Hashtable的所有 public 方法声明中都有 synchronized 关键字,而HashMap的源代码中则连 synchronized 的影子都没有...Hashmap###允许null,###Hashtable###不允许 哈希值的使用不同,Hashtable直接使用对象的hashCode,而HashMap重新计算hash值,而且用与代替求模 Hashtable...中hash数组默认大小是11,增加的方式是 old*2+1。...HashMap中hash数组的默认大小是16,而且一定是2的指数。
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。
线程安全: 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的幂作为哈希表的大小
HashMap允许null key和null value,而hashtable不允许。 2 HashTable是线程安全的一个Collection。...HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。...最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 ...Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。...Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。
领取专属 10元无门槛券
手把手带您无忧上云