【问题标题】:What are the differences between Hashmap vs Hashtable in theory?Hashmap和Hashtable在理论上有什么区别?
【发布时间】:2015-07-18 13:38:13
【问题描述】:

hashmap和hashtable在理论上有区别吗?

我的意思不是在 Java(或实现)中给出的具体定义,而是在理论上。哈希表不是使用哈希的映射......因此是哈希映射吗?

【问题讨论】:

  • HashMap(在java中)是哈希表(数据结构)的实现。
  • 问题是“java.util.Hashtable 和 java.util.HashMap 有什么区别?”还是将哈希表称为数据结构的问题?
  • 我想他问是否有哈希表和哈希图,作为不同的东西,在一些理论定义中。不是它们的 Java 实现
  • 对不起,我走错了。是的,我的意思是数据结构......或理论定义,而不是 java 实现。我看到了这个问题,但它是关于 java 实现的,而不是抽象或理论的想法。

标签: hashmap hashtable abstract theory difference


【解决方案1】:

根据Wikipedia,它们是一样的:

在计算中,哈希表(哈希图)是一种用于实现关联数组(...)的数据结构

根据Wikibooks,是一样的:

哈希表或哈希映射是一种将键与值相关联的数据结构。

StackOverflow 上的一些回答还指出:

哈希表通常很有用(它们也称为哈希图)(...)

【讨论】:

    【解决方案2】:

    哈希图和哈希表

    • 两者都属于地图接口。键 - 不能重复。
    • Hash Map  未同步,但我们可以将其转换为 synchronizedMap。它允许最多一个空键和任意数量的空值。
    • 哈希表  同步,因为它是遗留类。它不允许在键/值中为 null。
    • Hashtable默认初始容量为11,HashMap为16

    • 哈希——不会保证插入的顺序

    • 欲了解更多信息,请参阅my stack post

    public static void main(String[] args) {
        new Thread() {
            @Override public void run() {
                HashMap<String, Integer> hm = new HashMap<String, Integer>();
                hm.put("key0", 10); // Compiler Widens.
                hm.put("key1", null);
                hm.put("key0", new Integer(16)); // Overridden.
                hm.put(null, 20);
                hm.put(null, 70);
                hm.put(null, null);
                System.out.println("HashMap : "+hm); // hm.toString()
    
                Iterator<Entry<String, Integer>> it = hm.entrySet().iterator();
                while (it.hasNext()) {                  
                    Map.Entry<String, Integer> pair = (Map.Entry<String, Integer>)it.next();
                    System.out.println(pair.getKey() + " = " + pair.getValue());
                    it.remove(); // avoids a ConcurrentModificationException
                }
                // we can conver HashMap to synchronizedMap
                Collections.synchronizedMap(hm);
    
            }
        }.start();
        new Thread() {
            @Override public void run() {
                Hashtable<String, Integer> ht = new Hashtable<String, Integer>();
                try {
                    ht.put("product1", 12);
                    ht.put("product2", 13);
                    ht.put("product2", 14);
                //  ht.put(null, 20);
                //  ht.put("product2", null);
                    System.out.println("hash Table : "+ht);
    
                } catch (NullPointerException nul) {
                    System.out.println("HashTable will not accept null's eighter in key/value");
                    IllegalArgumentException iae = new IllegalArgumentException("nulls not accept");
                    iae.initCause(nul);
                    throw iae;
                }               
            }
        }.start();
    }
    

    【讨论】:

      【解决方案3】:
      1. 同步或线程安全:这是两者之间最重要的区别。 HashMap 是非同步的,不是线程安全的。另一方面,HashTable 是线程安全的和同步的。如果您的应用程序不需要任何多线程任务,则应使用 HashMap,换句话说,hashmap 更适合非线程应用程序。 HashTable 应该在多线程应用程序中使用。

      2. 空键和空值:Hashmap允许一个空键和任意数量的空值,而Hashtable不允许在HashTable对象中存在空键和空值。

      3. 性能:Hashmap 比 Hashtable 更快并且使用更少的内存,因为前者是不同步的。与单线程环境中的 Hashtable 等同步对象相比,非同步对象的性能通常要好得多。

      4. HashMap 继承 AbstractMap 类,Hashtable 继承 Dictionary 类。

      5. HashMap 与 Hashtable 之间的显着区别在于 HashMap 中的 Iterator 是一个快速失败的迭代器,而 Hashtable 的枚举器不是,如果任何其他线程通过添加或删除任何元素在结构上修改映射,则抛出 ConcurrentModificationException除了 Iterator 自己的 remove() 方法。但这不是保证行为,JVM 会尽最大努力来完成。这也是 Java 中 Enumeration 和 Iterator 的一个重要区别。

      【讨论】:

        【解决方案4】:

        主要区别在于 HashMap 由所有线程同时访问,并且大多数线程都进行了一些更改,因为某些更改对于每个线程 (async) 都不可见。哈希表是同步的,只有一个线程可以访问和更改哈希表。

        【讨论】:

          猜你喜欢
          • 2021-01-02
          • 1970-01-01
          • 2016-07-18
          • 2020-10-11
          • 2010-11-15
          • 1970-01-01
          • 2012-02-11
          • 2012-04-27
          • 2012-01-14
          相关资源
          最近更新 更多