关于Java:hash映射与哈希表之间的区别?

Differences between HashMap and Hashtable?

在Java中EDCOX1与0的EDCOX1和1的区别是什么?

哪个对于非线程应用程序更有效?


在Java中,EDOCX1与1的EDCX1和EDCX1之间有几个不同之处:

  • Hashtable是同步的,而HashMap不是同步的。这使得HashMap对于非线程应用程序更好,因为非同步对象通常比同步对象性能更好。

  • Hashtable不允许null键或值。HashMap允许一个null键和任意数量的null值。

  • hashmap的子类之一是LinkedHashMap,因此,如果您想要可预测的迭代顺序(默认情况下是插入顺序),您可以很容易地将HashMap替换为LinkedHashMap。如果你使用的是Hashtable,这就不容易了。

  • 因为同步对您来说不是问题,所以我建议您使用HashMap。如果同步成为一个问题,您也可以查看ConcurrentHashMap


    注意,很多答案都表示哈希表是同步的。实际上,这对你没什么好处。同步在访问器/转换器上,方法将停止两个线程同时添加或从映射中删除,但在现实世界中,您通常需要额外的同步。

    一个非常常见的习惯用法是"检查然后放入",即在Map中查找条目,如果该条目不存在,则添加它。无论您是使用Hashtable还是HashMap,这都不是原子操作。

    等效同步的HashMap可通过以下方式获得:

    1
    Collections.synchronizedMap(myMap);

    但要正确实现此逻辑,需要对表单进行额外的同步:

    1
    2
    3
    4
    synchronized(myMap) {
        if (!myMap.containsKey("tomato"))
            myMap.put("tomato","red");
    }

    即使迭代Hashtable的条目(或由Collections.synchronizedMap获得的HashMap也不是线程安全的,除非您还防止Map通过额外的同步进行修改。

    ConcurrentMap接口的实现(例如ConcurrentHashMap)通过包括线程安全检查来解决其中的一些问题,然后执行语义,例如:

    1
    ConcurrentMap.putIfAbsent(key, value);


    Hashtable被认为是遗留代码。使用HashMapHashMap的派生没有任何不能完成的Hashtable,所以对于新代码,我看不到返回Hashtable的任何理由。


    面试中经常会问这个问题,以检查应聘者是否理解集合类的正确用法,是否知道可用的替代解决方案。

  • hashmap类大致相当于hashtable,只是它不同步并且允许空值。(hashmap允许空值作为键和值,而hashtable不允许空值)。
  • hashmap不能保证映射的顺序在一段时间内保持不变。
  • 哈希映射是不同步的,而哈希表是同步的。
  • hashmap中的迭代器在hashtable的枚举器不为时是故障安全的,如果任何其他线程通过添加或删除迭代器自己的remove()方法以外的任何元素来修改映射,则抛出ConcurrentModificationException。但这不是一个保证的行为,将由JVM尽最大努力来完成。
  • 一些重要术语的注释

  • 同步意味着只有一个线程可以在一个时间点修改哈希表。基本上,这意味着在对哈希表执行更新之前,任何线程都必须获取对象的锁,而其他线程则等待释放锁。
  • 从迭代器的上下文来看,故障保护是相关的。如果在集合对象上创建了迭代器,而其他线程试图"结构化地"修改集合对象,则会引发并发修改异常。不过,其他线程也可以调用"set"方法,因为它不会"结构性"修改集合。但是,如果在调用"set"之前,集合已在结构上进行了修改,则将引发"IllegalArgumentException"。
  • 结构修改是指删除或插入能有效改变地图结构的元素。
  • hashmap可以通过以下方式进行同步:

    Map m = Collections.synchronizeMap(hashMap);

    映射提供集合视图,而不是直接支持迭代通过枚举对象。集合视图大大增强了接口的表现性,如本节后面所讨论的。map允许您迭代键、值或键值对;哈希表不提供第三个选项。地图提供了一种安全的方法在迭代过程中删除条目;哈希表没有。最后,map修复了hashtable接口中的一个小缺陷。hashtable有一个名为contains的方法,如果哈希表包含给定值。鉴于它的名字,你会预料到的如果哈希表包含给定的键,则返回true,因为密钥是哈希表的主要访问机制。地图接口通过重命名方法来消除这种混乱源包含价值。此外,这还提高了接口的一致性-containsValue与containsKey并行。

    The Map Interface


    HashMapMap接口的一种实现,使用散列码对数组进行索引。Hashtable:你好,1998年打电话来。他们想要他们的集合API返回。

    不过,说真的,你最好还是远离Hashtable。对于单线程应用程序,不需要额外的同步开销。对于高度并发的应用程序,偏执的同步可能导致饥饿、死锁或不必要的垃圾收集暂停。就像蒂姆·豪兰指出的那样,你可以用ConcurrentHashMap来代替。


    请记住,在引入Java集合框架(JCF)之前,EDCOX1×0是遗留类,后来被改装以实现EDCOX1×1接口。以东十一〔2〕和以东十一〔3〕也是如此。

    因此,在新代码中始终远离它们,因为正如其他人指出的那样,JCF中总是有更好的选择。

    下面是Java集合备忘录,您会发现它有用。注意,灰色块包含遗留类hashtable、vector和stack。

    enter image description here


    除了IZB所说的,HashMap允许空值,而Hashtable不允许空值。

    另请注意,Hashtable扩展了Dictionary类,该类是javadocs状态,已过时,已被Map接口取代。


    已经发布了很多好的答案。我在增加一些新的观点并总结它。

    HashMapHashtable都用于以键和值的形式存储数据。两者都使用散列技术来存储唯一的密钥。但是hashmap和下面给出的hashtable类之间有很多不同。

    哈希图

  • HashMap不同步。它不是线程安全的,如果没有适当的同步代码,就不能在多个线程之间共享。
  • HashMap允许一个空键和多个空值。
  • HashMap是JDK1.2中引入的一个新类。
  • HashMap很快。
  • 我们可以通过调用此代码使HashMap同步Map m = Collections.synchronizedMap(HashMap);
  • 迭代器遍历HashMap
  • HashMap中的迭代器故障很快。
  • HashMap继承abstractmap类。
  • 哈希表

  • Hashtable是同步的。它是线程安全的,可以与许多线程共享。
  • Hashtable不允许任何空键或值。
  • Hashtable是一个遗留类。
  • Hashtable慢。
  • Hashtable是内部同步的,不能不同步。
  • 枚举器和迭代器遍历Hashtable
  • Hashtable中的枚举数并不是很快失败的。
  • Hashtable继承字典类。
  • 进一步阅读HashMap和哈希表在Java中的区别是什么?

    enter image description here


    看看这个图表。它提供不同数据结构之间的比较,以及hashmap和hashtable。比较准确、清晰、易懂。

    Java集合矩阵


    HashtableHashMap相似,接口相似。建议您使用HashMap,除非您需要对遗留应用程序的支持或需要同步,因为Hashtables方法是同步的。因此,在您的情况下,由于您不是多线程的,所以HashMaps是您最好的选择。


    hashtable和hashmap的另一个关键区别是,hashmap中的迭代器失败得很快,而hashtable的枚举器不是,如果任何其他线程通过添加或删除迭代器自己的remove()方法以外的任何元素来修改映射,则抛出ConcurrentModificationException。但这不是一个保证的行为,将由JVM尽最大努力来完成。"

    我的来源:http://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.html


    除了这里已经提到的所有其他重要的方面外,集合API(例如,MAP接口)一直在修改,以符合Java规范的"最新和最伟大的"添加。

    例如,比较Java 5映射迭代:

    1
    2
    3
    for (Elem elem : map.keys()) {
      elem.doSth();
    }

    与旧的hashtable方法相比:

    1
    2
    3
    4
    for (Enumeration en = htable.keys(); en.hasMoreElements(); ) {
      Elem elem = (Elem) en.nextElement();
      elem.doSth();
    }

    在Java 1.8中,我们还承诺能够像旧的脚本语言那样构造和访问哈希图:

    1
    2
    Map<String,Integer> map = {"orange" : 12,"apples" : 15 };
    map["apples"];

    更新:不,他们不会在1.8着陆…:(

    Project Coin的收藏增强功能将在JDK8中吗?


    • hashtable是同步的,如果您在单个线程中使用它,那么您可以使用hashmap,这是一个未同步的版本。未同步对象的性能通常会提高一点。另外,如果多个线程同时访问一个哈希映射,并且至少有一个线程在结构上修改了该映射,那么它必须在外部同步。您可以使用以下方法将未同步的映射包装到同步的映射中:

      1
      Map m = Collections.synchronizedMap(new HashMap(...));
    • 哈希表只能包含非空对象作为键或值。哈希映射可以包含一个空键和空值。

    • map返回的迭代器失败得很快,如果在迭代器创建后的任何时候对map进行了结构修改,除了通过迭代器自己的remove方法之外,迭代器将以任何方式抛出ConcurrentModificationException。因此,在面对并发修改时,迭代器会快速而清晰地失败,而不是在未来的不确定时间内冒任意、不确定的风险。而hashtable的keys和elements方法返回的枚举不会很快失败。

    • 哈希表和HashMap是Java集合框架的成员(自Java 2平台V1.2,哈希表被改装以实现MAP接口)。

    • hashtable被认为是遗留代码,文档建议在需要线程安全的高度并发实现时使用concurrenthashmap代替hashtable。

    • hashmap不保证返回元素的顺序。对于hashtable,我想是一样的,但我不完全确定,我找不到明确说明这一点的资源。


    HashMapHashtable在算法上也存在显著差异。以前没人提起过,所以我才提起。HashMap将构造一个具有两个大小的幂的哈希表,动态地增加它,以便在任何存储桶中最多有八个元素(冲突),并且对于一般元素类型,它将很好地搅动元素。但是,如果您知道自己在做什么,Hashtable实现就可以更好、更精细地控制散列,也就是说,您可以使用最接近您的值的素数域大小来固定表大小,这将导致比散列映射更好的性能,即在某些情况下减少冲突。

    除了在这个问题中广泛讨论的明显差异之外,我把hashtable看作是一辆"手动驾驶"的车,在这里您可以更好地控制hashing,而hashmap则是"自动驾驶"的对应物,通常性能良好。


    hashtable是同步的,而hashmap不是同步的。这使得hashtable比hashmap慢。

    对于非线程应用程序,使用hashmap,因为它们在功能方面是相同的。


    根据这里的信息,我建议使用hashmap。我认为最大的好处是Java在迭代时会阻止你修改它,除非你通过迭代器完成它。


    Collection—有时称为容器—只是一个将多个元素组合成一个单元的对象。Collections用于存储、检索、操作和通信聚合数据。集合框架w是表示和操作集合的统一体系结构。好的。

    HashMapJDK1.2和hashtable JDK1.0都用于表示对中表示的一组对象。每对称为Entry对象。条目的收集由HashMapHashtable的对象引用。集合中的键必须是唯一的或独特的。[当它们用于检索映射值时,一个特定的键。集合中的值可以重复。]好的。

    ?超类、遗留和集合框架成员好的。

    hashtable是JDK1.0中引入的一个遗留类,它是dictionary类的一个子类。从JDK1.2重新设计hashtable以实现映射接口,使其成为集合框架的成员。HAZMAP是Java集合框架中的成员,从其在EDCOX1(3)中引入的开始就开始了。hashmap是abstractmap类的子类。好的。

    1
    2
    3
    public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable { ... }

    public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable { ... }

    ?初始容量和负载系数好的。

    容量是哈希表中的存储桶数,初始容量只是创建哈希表时的容量。请注意,哈希表是打开的:在"hashcollision的情况下,单个bucket存储多个条目,必须按顺序搜索。加载因子是一个度量散列表在自动增加其容量之前被允许达到的完整性的度量。好的。

    hashmap构造一个具有默认初始容量(16)和默认加载因子(0.75)的空哈希表。其中,as hashtable构造具有默认初始容量(11)和加载因子/填充率(0.75)的空hashtable。好的。

    Hash Map & Hashtable好的。

    ?哈希冲突时的结构修改好的。

    HashMapHashtable在哈希冲突的情况下,它们将映射条目存储在链接列表中。从java8到HashMap,如果散列桶超过某个阈值,该桶将从linked list of entries to a balanced tree切换。它将最坏情况下的性能从O(n)提高到O(logn)。将列表转换为二叉树时,哈希代码用作分支变量。如果同一个存储桶中有两个不同的哈希代码,则认为其中一个更大,位于树的右侧,另一个位于树的左侧。但是,当两个哈希代码都相等时,HashMap假定键是可比较的,并比较键以确定方向,以便保持一定的顺序。使HashMap的键具有可比性是一个很好的实践。在添加条目时,如果bucket大小达到TREEIFY_THRESHOLD = 8将条目的链接列表转换为平衡树,在删除小于TREEIFY_THRESHOLD的条目时,最多UNTREEIFY_THRESHOLD = 6将平衡树转换为条目的链接列表。Java 8 SRC,栈柱好的。

    ?集合视图迭代、快速失败和安全失败好的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
        +--------------------+-----------+-------------+
        |                    | Iterator  | Enumeration |
        +--------------------+-----------+-------------+
        | Hashtable          | fail-fast |    safe     |
        +--------------------+-----------+-------------+
        | HashMap            | fail-fast | fail-fast   |
        +--------------------+-----------+-------------+
        | ConcurrentHashMap  |   safe    |   safe      |
        +--------------------+-----------+-------------+

    Iterator本质上是一种快速失败。例如,如果在迭代除自己的remove()方法之外的其他方法时修改了集合,则它将抛出ConcurrentModificationException。如Enumeration所述,本质上是故障安全的。如果在迭代时修改了集合,则不会引发任何异常。好的。

    根据Java API文档,Iterator总是优于枚举。好的。

    注意:枚举接口的功能被迭代器接口复制。此外,迭代器添加了一个可选的移除操作,并且具有较短的方法名。新的实现应该优先考虑使用迭代器来枚举。好的。

    在Java 5中引入了CONTURNEXMAP接口:EDCOX1 OR 26 ED-一个高度并行的、高性能的EDCOX1×27实现,它由哈希表支持。此实现在执行检索时从不阻塞,并允许客户端选择更新的并发级别。它的目的是减少对Hashtable的替代:除了实施ConcurrentMap外,它还支持Hashtable特有的所有"遗留"方法。好的。

    • HashMapEntrys值是挥发性thereby精细粮食保障一致性方法contended modifications和subsequent读取;每读《reflects最最近完成的更新

      /好的。

    • 迭代器和enumerations是故障安全的状态,都反映在一些点从创造的迭代器所指向的元素/计数的方法;这允许同步读取和modifications的成本减少了一致性。他们不再把concurrentmodificationexception。。。。。。。但是,在自行设计的迭代器是可以使用的只有一个线程在一个时间。

      /好的。

    • 但像HashMapHashtable类,这个类并不允许零到可以使用作为key或值。

      /好的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    public static void main(String[] args) {

        //HashMap<String, Integer> hash = new HashMap<String, Integer>();
        Hashtable<String, Integer> hash = new Hashtable<String, Integer>();
        //ConcurrentHashMap<String, Integer> hash = new ConcurrentHashMap<>();

        new Thread() {
            @Override public void run() {
                try {
                    for (int i = 10; i < 20; i++) {
                        sleepThread(1);
                        System.out.println("T1 :- Key"+i);
                        hash.put("Key"+i, i);
                    }
                    System.out.println( System.identityHashCode( hash ) );
                } catch ( Exception e ) {
                    e.printStackTrace();
                }
            }
        }.start();
        new Thread() {
            @Override public void run() {
                try {
                    sleepThread(5);
                    // ConcurrentHashMap  traverse using Iterator, Enumeration is Fail-Safe.

                    // Hashtable traverse using Enumeration is Fail-Safe, Iterator is Fail-Fast.
                    for (Enumeration<String> e = hash.keys(); e.hasMoreElements(); ) {
                        sleepThread(1);
                        System.out.println("T2 :"+ e.nextElement());
                    }

                    // HashMap traverse using Iterator, Enumeration is Fail-Fast.
                    /*
                    for (Iterator< Entry<String, Integer> > it = hash.entrySet().iterator(); it.hasNext(); ) {
                        sleepThread(1);
                        System.out.println("T2 :"+ it.next());
                        // ConcurrentModificationException at java.util.Hashtable$Enumerator.next
                    }
                    */


                    /*
                    Set< Entry<String, Integer> > entrySet = hash.entrySet();
                    Iterator< Entry<String, Integer> > it = entrySet.iterator();
                    Enumeration<Entry<String, Integer>> entryEnumeration = Collections.enumeration( entrySet );
                    while( entryEnumeration.hasMoreElements() ) {
                        sleepThread(1);
                        Entry<String, Integer> nextElement = entryEnumeration.nextElement();
                        System.out.println("T2 :"+ nextElement.getKey() +" :"+ nextElement.getValue() );
                        //java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextNode
                        //                                          at java.util.HashMap$EntryIterator.next
                        //                                          at java.util.Collections$3.nextElement
                    }
                    */

                } catch ( Exception e ) {
                    e.printStackTrace();
                }
            }
        }.start();

        Map<String, String> unmodifiableMap = Collections.unmodifiableMap( map );
        try {
            unmodifiableMap.put("key4","unmodifiableMap");
        } catch (java.lang.UnsupportedOperationException e) {
            System.err.println("UnsupportedOperationException :"+ e.getMessage() );
        }
    }
    static void sleepThread( int sec ) {
        try {
            Thread.sleep( 1000 * sec );
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    ???????空和空值.

    /好的。

    HashMap允许的最大的一个空的密钥和任何数的空值。在AS Hashtable不t allow夏娃的一个单一的空和空键的值,如果值是null或密钥,那么它throws null时抛出。example

    /好的。

    ???????同步,线程安全的

    /好的。

    Hashtableinternally是同步的。因此,它是非常多的,安全的使用Hashtable在多线程应用程序的。在AS HashMapinternally是不同步的。因此,它是不安全的使用HashMap在多线程应用程序的外部不同步的。你可以externally synchronize HashMapCollections.synchronizedMap()使用方法。

    /好的。

    ???????的性能

    /好的。

    作为Hashtableinternally是同步的,这让Hashtable稍长的slower比HashMap。。。。。。。

    /好的。

    "看到

    /好的。

    • 一red–black树是一种自我平衡二进制搜索树
    • 性能改善的方法HashMap在Java 8

    好的。


    对于线程化的应用程序,您通常可以避开ConcurrentHashMap,这取决于您的性能需求。


    1.HashmapHashTable都存储密钥和值。

    2.Hashmap可以存储一个密钥作为null密钥。HashTable不能存储null

    3.Hashmap不同步,但HashTable同步。

    4.Hashmap可与Collection.SyncronizedMap(map)同步。

    1
    2
    3
    Map hashmap = new HashMap();

    Map map = Collections.SyncronizedMap(hashmap);


    除了已经提到的差异之外,应该注意到,自从Java 8以来,EDCOX1(0)动态地替换了每个桶中使用的树节点(红黑树)中的节点(链表),因此即使存在高散列冲突,搜索时最坏的情况也是。

    o(log(n))表示HashMap与o(n)表示Hashtable中。

    *上述改进尚未应用于Hashtable,但仅适用于HashMapLinkedHashMapConcurrentHashMap

    目前,

    • TREEIFY_THRESHOLD = 8:如果一个bucket包含8个以上的节点,则链表被转换成平衡树。
    • UNTREEIFY_THRESHOLD = 6:当存储桶太小(由于删除或调整大小)时,树会转换回链接列表。

    hashtable和hashmaps有5个基本区别。

  • 映射允许您迭代和检索键、值以及这两个键值对,而哈希表不具备所有这些功能。
  • 在hashtable中有一个函数contains(),使用起来非常混乱。因为"包含"的含义略有偏差。它是表示包含键还是包含值?很难理解。在映射中,我们有containsKey()和containsValue()函数,这两个函数很容易理解。
  • 在hashmap中,可以安全地在迭代时删除元素。在哈希表中是不可能的。
  • 哈希表在默认情况下是同步的,因此可以轻松地与多个线程一起使用。其中as散列映射在默认情况下不同步,因此只能用于单个线程。但仍然可以使用collections-util类的synchronizedMap(map m)函数将hashmap转换为synchronized。
  • 哈希表不允许空键或空值。其中as hashmap允许一个空键和多个空值。

  • 我的小贡献:

  • First and most significant different between Hashtable and HashMap is that, HashMap is not thread-safe while Hashtable is a thread-safe collection.

  • Second important difference between Hashtable and HashMap is performance, since HashMap is not synchronized it perform better than Hashtable.

  • Third difference on Hashtable vs HashMap is that Hashtable is obsolete class and you should be using ConcurrentHashMap in place of Hashtable in Java.


  • hashtable是JDK中的一个遗留类,不应该再使用了。用Concurrenthashmap替换它的用法。如果您不需要线程安全,请使用hashmap,它不是threadsafe,而是更快、占用更少内存。


    hashmap:它是java.util包中可用的类,用于以键和值格式存储元素。

    哈希表:它是一个遗留类,在集合框架内被识别。


    哈希映射和哈希表

    • 关于hashmap和hashtable的一些要点。请阅读以下详细信息。

    1)hashtable和hashmap实现java.util.map接口2)hashmap和hashtable都是基于哈希的集合。并致力于散列。所以这些是hashmap和hashtable的相似性。

    • hashmap和hashtable有什么区别?

    1)第一个区别是hashmap不是线程安全的,而hashtable是线程安全的2)hashmap的性能更好,因为它不是线程安全的。虽然哈希表的性能并不好,因为它是线程安全的。因此多线程不能同时访问哈希表。


    1)hashtable是同步的,而hashmap不是同步的。2)另一个区别是hashmap中的迭代器是故障安全的,而hashtable的枚举器不是。如果在迭代器中更改映射,您将知道。

    3)hashmap允许空值,hashtable不允许空值。


    Hashtable:

    hashtable是一种保留键值对值的数据结构。它不允许键和值都为空。如果添加空值,您将得到一个NullPointerException。它是同步的。所以它也有它的成本。在特定的时间只有一个线程可以访问哈希表。

    例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    import java.util.Map;
    import java.util.Hashtable;

    public class TestClass {

        public static void main(String args[ ]) {
        Map<Integer,String> states= new Hashtable<Integer,String>();
        states.put(1,"INDIA");
        states.put(2,"USA");

        states.put(3, null);    //will throw NullPointerEcxeption at runtime

        System.out.println(states.get(1));
        System.out.println(states.get(2));
    //  System.out.println(states.get(3));

        }
    }

    HashMap:

    hashmap类似于hashtable,但它也接受键值对。它允许键和值都为空。它的性能优于HashTable,因为它是unsynchronized

    例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    import java.util.HashMap;
    import java.util.Map;

    public class TestClass {

        public static void main(String args[ ]) {
        Map<Integer,String> states = new HashMap<Integer,String>();
        states.put(1,"INDIA");
        states.put(2,"USA");

        states.put(3, null);    // Okay
        states.put(null,"UK");

        System.out.println(states.get(1));
        System.out.println(states.get(2));
        System.out.println(states.get(3));

        }
    }

    hashmaps为您提供了同步和调试的自由,这要容易得多。


    HashMap是模拟的,因此在GWT client code中可用,而Hashtable不是。


    同步或线程安全:

    哈希映射不同步,因此它不是线程安全的,如果没有正确的同步块,它不能在多个线程之间共享,而哈希表是同步的,因此它是线程安全的。

    空键和空值:

    哈希映射允许一个空键和任意数量的空值。哈希表不允许空键或值。

    迭代值:

    hashmap中的迭代器是一个fail-fast迭代器,而hashtable的枚举器不是,如果任何其他线程通过添加或删除迭代器自己的remove()方法之外的任何元素来修改映射,则抛出ConcurrentModificationException。

    超类和传统:

    hashmap是abstractmap类的子类,而hashtable是dictionary类的子类。

    性能:

    因为hashmap不同步,所以比hashtable更快。

    参考HTTP://NothPosialA.COM/ToeLe/1020/差异-HasMAP-和HASTABLE在Java中的示例和面试问题和与Java集合相关的问答


    hashmap是一个用于以键和值格式存储元素的类。它不是线程安全的。因为它不同步。其中as-hashtable是同步的。hashmap允许空值,但hastable不允许空值。


    由于Java中的哈希表是字典类的一个子类,由于映射接口的存在,字典类现在已经过时,不再使用它。此外,对于实现映射接口的类,没有什么是您不能做的,您可以用哈希表来做。


    老的和经典的主题,只想添加这个有帮助的博客,解释这一点:

    http://blog.manishchabra.com/2012/08/the-5-main-differences-betwen-hashmap-and-hashtable/

    Manish Chhabra的博客

    The 5 main differences betwen HashMap and Hashtable

    HashMap and Hashtable both implement java.util.Map interface but there
    are some differences that Java developers must understand to write
    more efficient code. As of the Java 2 platform v1.2, Hashtable class
    was retrofitted to implement the Map interface, making it a member of
    the Java Collections Framework.

  • One of the major differences between HashMap and Hashtable is that HashMap is non-synchronized whereas Hashtable is synchronized, which
    means Hashtable is thread-safe and can be shared between multiple
    threads but HashMap cannot be shared between multiple threads without
    proper synchronization. Java 5 introduced ConcurrentHashMap which is
    an alternative of Hashtable and provides better scalability than
    Hashtable in Java.Synchronized means only one thread can modify a hash
    table at one point of time. Basically, it means that any thread before
    performing an update on a hashtable will have to acquire a lock on the
    object while others will wait for lock to be released.

  • The HashMap class is roughly equivalent to Hashtable, except that it permits nulls. (HashMap allows null values as key and value whereas
    Hashtable doesn’t allow nulls).

  • The third significant difference between HashMap vs Hashtable is that Iterator in the HashMap is a fail-fast iterator while the
    enumerator for the Hashtable is not and throw
    ConcurrentModificationException if any other Thread modifies the map
    structurally by adding or removing any element except Iterator’s own
    remove() method. But this is not a guaranteed behavior and will be
    done by JVM on best effort. This is also an important difference
    between Enumeration and Iterator in Java.

  • One more notable difference between Hashtable and HashMap is that because of thread-safety and synchronization Hashtable is much slower
    than HashMap if used in Single threaded environment. So if you don’t
    need synchronization and HashMap is only used by one thread, it out
    perform Hashtable in Java.

  • HashMap does not guarantee that the order of the map will remain constant over time.

  • Note that HashMap can be synchronized by

    1
    Map m = Collections.synchronizedMap(hashMap);

    In Summary there are significant differences between Hashtable and
    HashMap in Java e.g. thread-safety and speed and based upon that only
    use Hashtable if you absolutely need thread-safety, if you are running
    Java 5 consider using ConcurrentHashMap in Java.


    hashtable类是同步的,也就是说,它被设计用于处理多线程或多线程进程的应用程序。在应用程序到进程的经典情况下,同步类的效率较低,因此hashmap类通常更快。hashtable类不接受空值(键或值),而hashmap类允许一个具有空值和尽可能多的空值的键。