Java Hashtable和Synchronized Map的区别

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。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程