理论上hashmap和hashtable之间是否存在差异?
我不是在Java(或实现)中给出的具体定义中,而是在理论上。不是散列表是一个使用散列的映射...因此是一个散列映射吗?
答案 0 :(得分:2)
根据Wikipedia,它们是相同的:
在计算中,哈希表(哈希映射)是用于实现关联数组的数据结构(...)
根据Wikibooks,它是一样的:
哈希表或哈希映射是将键与值相关联的数据结构。
StackOverflow上的一些答案也说明了:
Hashtable通常很有用(它们也称为哈希映射)(...)
答案 1 :(得分:1)
哈希地图&哈希表强>
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();
}
答案 2 :(得分:0)
同步或线程安全:这是两者之间最重要的区别。 HashMap是非同步的,而不是线程安全的。另一方面,HashTable是线程安全和synchronized.HashMap应该在您的应用程序不需要任何多线程任务时使用,换句话说,hashmap更适合非线程应用程序。 HashTable应该用在多线程应用程序中。
空键和空值:Hashmap允许一个空键和任意数量的空值,而Hashtable不允许HashTable对象中的空键和空值。
性能:Hashmap比Hashtable更快,使用的内存更少,因为前者不同步。与单线程环境中的Hashtable等同步对象相比,非同步对象的性能通常要好得多。
HashMap继承了AbstractMap类,而Hashtable继承了Dictionary类。
HashMap与Hashtable之间的显着区别在于HashMap中的Iterator是一个故障快速迭代器,而Hashtable的枚举器不是,如果任何其他Thread通过添加或删除任何元素从结构上修改了map,则抛出ConcurrentModificationException除了Iterator自己的remove()方法。但这不是一种保证行为,将由JVM尽最大努力完成。这也是Java中Enumeration和Iterator之间的重要区别。
答案 3 :(得分:0)
主要区别在于,所有线程同时访问HashMap,并且大多数线程都进行了一些更改,结果是某些更改对于每个单个线程(异步)都不可见。 hashTable是同步的,只有一个线程可以访问和更改HashTable。