HashMap和HashTable 区别和联系

本文详细对比了HashMap与HashTable在继承、接口、Null值支持、线程安全、初始及扩容容量等方面的差异。揭示了两者的设计理念及适用场景,强调了在多线程环境下使用线程安全的ConcurrentHashMap的重要性。

1.继承父类不同
HashMap继承自AbstractMap<K,V>类,而HashTable继承自Dictionary<K,V>类。
不过它们都实现了同时实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口
在这里插入图片描述
在这里插入图片描述
Dictionary类是一个已经被废弃的类(见其源码中的注释)。父类都被废弃,自然而然也没人用它的子类Hashtable了。

  • NOTE: This class is obsolete. New implementations should
  • implement the Map interface, rather than extending this class.!

2.对外提供接口不同

Hashtable比HashMap多提供了elments()contains() 两个方法。

elments() 方法继承自Hashtable的父类Dictionnary。elements() 方法用于返回此Hashtable中的value的枚举。
在这里插入图片描述
contains() 方法判断该Hashtable是否包含传入的value。
它的作用与containsValue()一致。事实上,contansValue() 就只是调用了一下contains() 方法。
在这里插入图片描述
在这里插入图片描述

3.对Null key 和Null value的支持不同
HashTable()既不支持Null Key也不支持Null Value,在HashTable()的put方法注释中有说明.
在这里插入图片描述
当key为Null时,调用put() 方法,运行到下面这一步就会抛出空指针异常。因为拿一个Null值去调用方法了。
在这里插入图片描述
当value值为空时,HashTable也做了限制,在这一步会抛出异常:
在这里插入图片描述

4.线程安全性不同
HashTable是线程安全的,在每个方法都加入了synchronized方法,在多线程并发环境下,可以直接使用HashTable,不需要自己实现同步的方法。

HashMap是线程不安全的,在多线程并发环境下,可能产生死锁等问题。使用HashMap必须自己实现同步方法。

虽然HashMap不是线程安全的,但是它的效率会比Hashtable要好很多。这样设计是合理的。在我们的日常使用当中,大部分时间是单线程操作的。HashMap把这部分操作解放出来了。当需要多线程操作的时候可以使用线程安全的ConcurrentHashMap。ConcurrentHashMap虽然也是线程安全的,但是它的效率比Hashtable要高好多倍。因为ConcurrentHashMap使用了分段锁,并不对整个数据进行锁定。

5.初始容量大小和每次扩充容量大小的不同
Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。
HashTable:
在这里插入图片描述
在这里插入图片描述
HashMap:
在这里插入图片描述
在这里插入图片描述
创建时,如果给定了容量初始值,那么Hashtable会直接使用你给定的大小,而HashMap会将其扩充为2的幂次方大小。也就是说Hashtable会尽量使用素数、奇数。而HashMap则总是使用2的幂作为哈希表的大小。

HashMap Hashtable 都是用于存储键值对的数据结构,它们在功能上非常相似,但也存在一些区别。 1. 线程安全性:Hashtable 是线程安全的,即多个线程可以同时访问一个 Hashtable 实例而不需要额外的同步措施。而 HashMap 不是线程安全的,如果多个线程同时访问一个 HashMap 实例,可能会导致数据不一致的问题。如果需要在多线程环境下使用,可以考虑使用 ConcurrentHashMap。 2. null 键 null 值:Hashtable 不允许键或值为 null,如果尝试将 null 键或 null 值放入 Hashtable 中,会抛出 NullPointerException。而 HashMap 允许键值为 null,可以正常存储获取 null 值。 3. 继承关系:Hashtable 是 Dictionary 类的子类,而 HashMap 是 AbstractMap 类的子类。由于继承关系的不同,导致它们在实现上有一些差异。 4. 迭代顺序:HashMap 不保证迭代顺序,即遍历 HashMap 的键值对时,不一定按照插入顺序或者其他顺序进行遍历。而 Hashtable 的迭代顺序是按照插入顺序进行的。 5. 性能:由于 Hashtable 是线程安全的,它在多线程环境下的性能可能会受到一定影响。而 HashMap 在单线程环境下的性能通常会更好。 总的来说,如果在单线程环境下使用,并且需要允许键或值为 null,可以优先选择使用 HashMap。如果在多线程环境下使用,或者需要保证迭代顺序,可以考虑使用 Hashtable
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值