Hashtable类实现了一个哈希表,它将键映射到值。任何非空对象都可以被用作键或值。为了成功地从Hashtable中存储和检索对象,用作键的对象必须实现hashCode方法和equals方法。
Hashtable的特点:
- Hashtable有点像HashMap,但是是同步的。
- Hashtable在哈希表中存储键/值对。
- 在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 11");
mytable.put(2, "James 22");
mytable.put(3, "James 33");
mytable.put(4, "James 44");
// Iterating through HashTable
for (Map.Entry m : mytable.entrySet())
{
System.out.println(m.getKey() + " " + m.getValue());
}
}
}
运行结果:
4 James 44
3 James 33
2 James 22
1 James 11
同步哈希映射(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, "2yiibai");
hmap.put(44, "44yiibai");
hmap.put(1, "1yiibai");
hmap.put(4, "4yiibai");
hmap.put(88, "88yiibai");
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: 1yiibai
2: 2yiibai
4: 4yiibai
88: 88yiibai
44: 44yiibai
Hashtable 和 SynchronizedHashMap 的区别
Hashtable | SynchronizedHashMap |
---|---|
Hashtable甚至不允许有一个空键和空值。 | Synchronized HashMap允许一个空键和任意数量的空值。 |
Hashtable返回的迭代器在本质上是安全的,即如果地图在迭代器创建后被修改,它们不会抛出ConcurrentModificationException 。 |
同步HashMap返回的迭代器是快速失败的,也就是说,如果地图在迭代器创建后被修改,它们会抛出ConcurrentModificationException 。 |
HashTable从JDK 1.1开始就存在了。从JDK 1.2开始,它成为了Java集合框架的一部分。 | HashMap是在JDK 1.2中引入的。 |
HashTable是一个传统的类。它有时被认为是要被废弃的。建议不要在应用程序中使用HashTable。 | 如果想获得高水平的数据一致性,那么只能考虑使用同步的HashMap。 |
Java中Hashtable和Synchronized Map的区别
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果。
转载请注明:文章转载自 有区别网 [http://www.vsdiffer.com]
本文标题:Java中Hashtable和Synchronized Map的区别
本文链接:https://www.vsdiffer.com/vs/difference-between-hashtable-and-synchronized-map-in-java.html
免责声明:以上内容仅代表 个人看法、理解、学习笔记、总结和研究收藏。不保证其正确性,因使用而带来的风险与本站无关!如本网站内容冒犯了您的权益,请联系站长,邮箱: ,我们核实并会尽快处理。