理论上Hashmap与Hashtable有什么区别?

问题描述 投票:2回答:3

在理论上,hashmap和hashtable之间是否存在差异?

我不是指Java(或实现)中给出的具体定义,而是理论上的。散列表不是使用散列的映射...因此是散列映射?

hashmap hashtable abstract theory difference
3个回答
2
投票

根据Wikipedia,它们是相同的:

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

Wikibooks说,它是一样的:

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

关于StackOverflow的一些答案还指出:

Hashtable通常很有用(它们也称为哈希映射)(...)


1
投票

Hashmap和Hashtable

  • 两者都属于Map Interface。键 - 不能重复。
  • 哈希映射未同步但我们可以将其转换为synchronizedMap。它允许最多一个空键和任意数量的空值。
  • 哈希表同步,因为它是遗留类。它不允许在键/值中为空。
  • 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();
}

Hash Map & Hashtable


0
投票
  1. 同步或线程安全:这是两者之间最重要的区别。 HashMap是非同步的,而不是线程安全的。另一方面,HashTable是线程安全和synchronized.HashMap应该在您的应用程序不需要任何多线程任务时使用,换句话说,hashmap更适合非线程应用程序。 HashTable应该用在多线程应用程序中。
  2. 空键和空值:Hashmap允许一个空键和任意数量的空值,而Hashtable不允许HashTable对象中的空键和空值。
  3. 性能:Hashmap比Hashtable更快,使用的内存更少,因为前者是不同步的。与单线程环境中的Hashtable等同步对象相比,非同步对象的性能通常要好得多。
  4. HashMap继承了AbstractMap类,而Hashtable继承了Dictionary类。
  5. HashMap与Hashtable之间的显着区别在于HashMap中的Iterator是一个快速失败的迭代器,而Hashtable的枚举器不是,如果任何其他Thread通过添加或删除除Iterator自己的remove()之外的任何元素来修改地图,则抛出ConcurrentModificationException方法。但这不是一种保证行为,将由JVM尽最大努力完成。这也是Java中Enumeration和Iterator之间的重要区别。
© www.soinside.com 2019 - 2024. All rights reserved.