• HashMap和Hashtable的区别


    比较HashMap和Hashtable

    1) Hashtable线程安全的(即定义在Hashtable中的方法),但HashMap不是。如果你想使一个HashMap是线程安全的,可以使用 Collections.synchronizedMap(map) 或者ConcurrentHashMap
    Hashtabe中的同步方法是如下定义的

    1 public synchronized boolean contains(Object obj){ ... }
    2 public synchronized boolean containsKey(Object obj){ ... }
    3 public synchronized Object get(Object obj){ ... }
    4 public synchronized Object put(Object obj, Object obj1){ ... }
    5 public synchronized Object remove(Object obj){ ... }

    2) Hashtable不允许空(null)的键或值HashMap允许一个空键(其他的空键会覆盖第一个空键)和任意数量的空值

     1 Hashtable<String, String> hashTable = new Hashtable<String, String>();
     2 hashTable.put(null, "value");
     3 //OR
     4 hashTable.put("key", null);
     5 
     6 Output:
     7 
     8 Exception in thread "main" java.lang.NullPointerException
     9     at java.util.Hashtable.hash(Unknown Source)
    10     at java.util.Hashtable.put(Unknown Source)
    11     at test.core.MapExamples.main(MapExamples.java:12)

    3) Hashtable从Java语言问世的以来就已经存在,而HashMap是在Java集合框架诞生作为其一部分新出现的(JDK 1.2)。还要注意正如Java docs所声明的Hashtable继承Dictionary类,而在新的JDK版本中增加了实现Map接口

    1 //HashTable is defined as
    2 public class Hashtable extends Dictionary implements Map, Cloneable, Serializable {}
    3 //HashMap is defined as
    4 public class HashMap extends AbstractMap implements Map, Cloneable, Serializable {}

    4) HashMap的迭代器(Iterator)是快速失败(fail-fast)的,如果其他线程不用迭代器本身的remove()方法,而通过别的add或remove任何元素,从而修改了Map的中的数据,那么会抛出ConcurrentModificationException,JVM会尽力,但这并不是一个有保证的行为。Hashtable的枚举器(Enumerator)不是快速失败的(fail-fast)。

     1 HashMap<String, String> hashMap = new HashMap<String, String>();
     2 hashMap.put("key1", "value1");
     3 hashMap.put("key2", "value2");
     4 hashMap.put("key3", "value3");
     5 hashMap.put("key4", "value4");
     6 
     7 Iterator<String> iterator = hashMap.keySet().iterator();
     8 while(iterator.hasNext()){
     9     iterator.next();
    10     iterator.remove();
    11     System.out.println(hashMap);
    12 }
    13 
    14 Output:
    15 
    16 {key3=value3, key2=value2, key1=value1}
    17 {key2=value2, key1=value1}
    18 {key1=value1}
    19 {}

    5) 最后,Map接口修正了一个Hashtable的小缺陷。Hashtable有一个方法contains(),但方法名并不明确到底包含键,还是包含值,在Map接口中被删掉,只留下了containsValue() 和containsKey()。

    public boolean containsKey(Object obj) {...}
    public boolean containsValue(Object obj) {...}

    对于HashMap和Hashtable使用建议

    几乎没有任何工作是只能Hashtable做,而HashMap及其相关的类(如LinkedHashMap或者ConcurrentHashMap)不能完成的。所以,您编写的代码没有很好的理由使用Hashtable总是优先实用HashMap




  • 相关阅读:
    7-22 朋友圈(25 分)
    c++之函数重载
    c++之函数的其它用法
    c++之引用
    c++之内存模型
    c++实例之通讯录管理系统之清空联系人功能(七)
    c++实例之通讯录管理系统之修改联系人功能(六)
    c++实例之通讯录管理系统之查找联系人功能(五)
    c++实例之通讯录管理系统之删除联系人功能(四)
    c++实例之通讯录管理系统之显示联系人功能(三)
  • 原文地址:https://www.cnblogs.com/xiangxiushu/p/10829159.html
Copyright © 2020-2023  润新知