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
免责声明:以上内容仅代表 个人看法、理解、学习笔记、总结和研究收藏。不保证其正确性,因使用而带来的风险与本站无关!如本网站内容冒犯了您的权益,请联系站长,邮箱: ,我们核实并会尽快处理。