zoukankan      html  css  js  c++  java
  • hashmap和hashtable异同

    (一)继承的历史不同

     Hashtable是继承自Dictionary类的,而HashMap则是Java 1.2引进的Map接口的一个实现。

    public class Hashtable extends Dictionary implements Map
    public class HashMap  extends AbstractMap implements Map   

    (二)安全性不同

        HashMap是非synchronized,而HashTable在默认的情况下是synchronized,这意味着HashTable是线程安全的,多个线程可以共享一个HashTable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5以后提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。当然,我们可以通过以下方法让HashMap同步:

    Map m = Collections.synchronizeMap(hashMap);

    (三)是否可为空值的异同

        HashMap可以让你将空值作为一个表条目的key或value。HashMap中只有一条记录可以是一个空的key,但任意数量的条目可以是空的value。这就是说,如果在表中没有发现搜索键,或者如果发现了搜索键,但它是一个空的值,那么get()将返回null;而HashTable则不行,key和value都不允许出现null值。

    (四)二者的遍历方式的内部实现上不同

        HashTable使用Enumeration,HashMap使用Iterator,HashMap的迭代器(Iterator)是fail-fast迭代器,而HashTable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(删除或者插入一个元素,这样会影响到map的结构素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM

    (五)哈希值的使用不同

    • HashTable直接使用对象的hashCode,代码是这样的
       int hash = key.hashCode();
       int index = (hash & 0x7FFFFFFF) % tab.length; 
    • 而HashMap重新计算hash值,而且用与代替求模:
       int hash = hash(k);
       int i = indexFor(hash, table.length); 

    (六)二者内部实现方式的数组的初始大小和扩容的方式不同

        HashTable中hash数组默认大小是11,增加的方式是 old*2+1;HashMap中hash数组的默认大小是16,而且一定是2的指数。


  • 相关阅读:
    每日总结
    每日总结
    每日总结
    每日总结
    每日总结
    每日总结
    每日总结
    每日总结
    每日总结
    Windows邮件添加QQ邮箱
  • 原文地址:https://www.cnblogs.com/sjxbg/p/8796221.html
Copyright © 2011-2022 走看看