HashMap和Hashtable的区别

HashMap和Hashtable的区别

1.线程安全

HashMap是线程不安全,但是处理速度快,Hashtable线程安全,但是相对处理速度慢,主要因素就是方法中是否增加了Synchronize关键字;

Hashtable的put方法和remove方法
在这里插入图片描述
在这里插入图片描述

HashMap的put方法和remove方法

在这里插入图片描述

2.是否提供contains方法

HashMap只有containsValue和containsKey方法;HashTable有contains、containsKey和containsValue三个方法,其中contains和containsValue方法功能相同。

Hashtable

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3JpZTbHY-1617503202390)(C:\Users\zhanghaodi\AppData\Roaming\Typora\typora-user-images\image-20210404095829971.png)]

HashMap

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vBlGoBQh-1617503202391)(C:\Users\zhanghaodi\AppData\Roaming\Typora\typora-user-images\image-20210404095917747.png)]

3.是否允许为空值

Hashtable中,key和value都不允许出现null值。HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。

 *
   @param      value   the value
 * @return     the previous value of the specified key in this hashtable,
 *             or <code>null</code> if it did not have one
 * @exception  NullPointerException  if the key or value is 
 *                   <code>null</code>     //源码解释如果key或者value为空将会报空指针异常
 * @see     Object#equals(Object)
 * @see     #get(Object)
 */
public synchronized V put(K key, V value) {   //这是Hashtable的put方法源码解析
    // Make sure the value is not null        //确保value不为空
    if (value == null) {
        throw new NullPointerException();
    }
/**
 *//HashTable的put方法中没有相应的异常说明,允许key或者value为空
 *
 * Associates the specified value with the specified key in this map.
 * If the map previously contained a mapping for the key, the old
 * value is replaced.
 *
 * @param key key with which the specified value is to be associated
 * @param value value to be associated with the specified key
 * @return the previous value associated with <tt>key</tt>, or
 *         <tt>null</tt> if there was no mapping for <tt>key</tt>.
 *         (A <tt>null</tt> return can also indicate that the map
 *         previously associated <tt>null</tt> with <tt>key</tt>.)
 */
public V put(K key, V value) {
    return putVal(hash(key), key, value, false, true);
}

4. 数组初始化和扩容机制

HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。

Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。

5.基类不同

HashTable基于Dictionary类,而HashMap是基于AbstractMap。Dictionary是什么?它是任何可将键映射到相应值的类的抽象父类,而AbstractMap是基于Map接口的骨干实现,它以最大限度地减少实现此接口所需的工作。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Et7eqwma-1617503202413)(C:\Users\zhanghaodi\AppData\Roaming\Typora\typora-user-images\image-20210404102127344.png)]

Hashtable

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3a6ZcrEQ-1617503202415)(C:\Users\zhanghaodi\AppData\Roaming\Typora\typora-user-images\image-20210404102309769.png)]

补充

Hashtable和Vector集合一样,在jdk1.2版本之后被更先进的集合(HashMap,ArrayList)取代了

但是Hashtable的子类Properties(配置文件)依然活跃在历史舞台 xml

一样,在jdk1.2版本之后被更先进的集合(HashMap,ArrayList)取代了

但是Hashtable的子类Properties(配置文件)依然活跃在历史舞台 xml

Properties集合是一个唯一和IO流相结合的集合

HashMapHashtable 都是用于存储键值对的数据结构,它们在功能上非常相似,但也存在一些区别。 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值