Java Hashtable和Synchronized Map的区别
Hashtable类实现了一个哈希表,它将键映射到值。任何非空对象都可以被用作键或值。为了成功地从Hashtable中存储和检索对象,用作键的对象必须实现hashCode方法和equals方法。
Hashtable的特点。
- 它有点像HashMap,但是是同步的。
- 哈希表在哈希表中存储键/值对。
- 在Hashtable中,我们指定一个作为键的对象,以及我们想与该键相关联的值。然后对键进行散列,产生的散列代码被用作索引,该值被存储在表中。
- Hashtable类的初始默认容量为11,而负载系数为0.75。
- HashMap不提供任何枚举,而Hashtable则不提供失败的枚举。
示例:
// Java program to demonstrate the
// usage of HashTable
import java.util.*;
class Hashtable1 {
public static void main(String args[])
{
// Creating a HashTable
Hashtable<Integer, String> mytable = new Hashtable<Integer, String>();
// Adding elements to HashTable
mytable.put(1, "James Bond");
mytable.put(2, "Donald Trumph");
mytable.put(3, "Joe Biden");
mytable.put(4, "Mona Lisa");
// Iterating through HashTable
for (Map.Entry m : mytable.entrySet())
{
System.out.println(m.getKey() + " "
+ m.getValue());
}
}
}
输出
4 Mona Lisa
3 Joe Biden
2 Donald Trumph
1 James Bond
SynchronizedHashMap
- 在对象层面的同步。
- 每个读/写操作都需要获得锁。
- 锁定整个集合是一种性能开销。
- 这实质上是让一个线程访问整个地图,并阻断所有其他线程。
- 这可能会引起争论。
- SynchronizedHashMap返回Iterator,它在并发修改时失败得很快。
示例:
// Java program to demonstrate the
// usage of Synchronized HashMap
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class HashMapSyncExample {
public static void main(String args[])
{
// Creating HashMap
HashMap<Integer, String> hmap = new HashMap<Integer, String>();
// Adding elements in HashMap
hmap.put(2, "Anil");
hmap.put(44, "Ajit");
hmap.put(1, "Brad");
hmap.put(4, "Sachin");
hmap.put(88, "XYZ");
Map map = Collections.synchronizedMap(hmap);
Set set = map.entrySet();
synchronized (map)
{
Iterator i = set.iterator();
// Display elements
while (i.hasNext())
{
Map.Entry me = (Map.Entry)i.next();
System.out.print(me.getKey() + ": ");
System.out.println(me.getValue());
}
}
}
}
输出
1: Brad
2: Anil
4: Sachin
88: XYZ
44: Ajit
Hashtable vs SynchronizedHashMap
Hashtable | SynchronizedHashMap |
---|---|
Hashtable甚至不允许有一个空键和空值。 | 同步的HashMap允许一个空键和任意数量的空值。 |
Hashtable返回的迭代器在本质上是安全的,即如果地图在迭代器创建后被修改,它们不会抛出ConcurrentModificationException。 | 同步HashMap返回的迭代器在本质上是快速失败的,即如果在迭代器创建后地图被修改,他们会抛出ConcurrentModificationException。 |
HashTable从JDK 1.1开始就存在了。从JDK 1.2开始,它已经成为Java Collection Framework的一部分。 | HashMap是在JDK 1.2中引入的。 |
HashTable是一个传统的类。它有时被认为是要被废弃的。因此,建议不要在你的应用程序中使用HashTable。 | 如果你想获得高水平的数据一致性,那么只能考虑使用同步的HashMap。 |