Java中Hashtable与HashMap的区别

Java中Map用于保存具有映射关系的数据,Map集合中保存着两组值,一组用来存放key,另外一组用来存放value,key和value为一对一的单向关系,即每个key值对应唯一一个value,其中key值不允许重复。Map接口中定义了如下常用的方法:

Map中还包括一个内部类Entry,该类封装了一个key-value对。Entry包含如下三个方法:

Map集合最典型的用法就是成对地添加、删除key-value对,判断该Map中是否包含指定key,是否包含指定value,也可以通过Map提供的keySet()方法获取所有key组成的集合,然后使用foreach循环来遍历Map的所有key,根据key即可遍历所有的value。
Hashtable和HashMap是Map接口的两个典型实现类。


一、Hashtable介绍

从Hashtable的名字上就可以看出是一个古老的类,在JDK1.0起就出现了,早期Java不注意类的命名方式,后期虽然规范了命名规则,但是已经有大部分代码使用了这个类,也就没有再改成HashTable,当它出现时,Java还没有实现Map接口,所以包含了两个繁琐的方法elements()和keys(),现在已经很少使用这两个方法。
Hashtable是基于哈希表实现的,每个元素是一个key-value对,内部通过单链表解决冲突问题,当容量不足(超过了阀值)时,会自动增长。Hashtable可以在多线程环境中使用,是线程安全的。


二、HashMap介绍

HashMap同样是Map接口的实现类,它也是一个哈希表,存储的内容是键值对(key-value)映射。HashMap继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。
HashMap的实现不是同步的,这意味着它不是线程安全的。HashMap的key、value都可以为null。此外,HashMap中的映射不是有序的。
HashMap的实例有两个参数影响其性能:“初始容量” 和 “加载因子”。容量是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。
通常,默认加载因子是 0.75, 这是在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括 get 和 put 操作,都反映了这一点)。


三、Hashtable与HashMap的区别

  1. 继承不同
    public class Hashtable extends Dictionary implements Map
    public class HashMap extends AbstractMap implements Map
  2. 线程安全性不同
    Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
  3. null值设置不同
    Hashtable中,key和value都不允许出现null值。在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。
  4. 两个遍历方式的内部实现上不同
    Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
  5. 哈希值的使用不同
    HashTable直接使用对象的hashCode,而HashMap重新计算hash值。
  6. 内部实现方式的数组的初始大小和扩容的方式不同
    HashTable中hash数组默认大小是11,增加的方式是old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。
    Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值