Hashtable与ConcurrentHashMap入门——简单使用

Posted 流楚丶格念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hashtable与ConcurrentHashMap入门——简单使用相关的知识,希望对你有一定的参考价值。

文章目录

1.1 Hashtable简单介绍

Hashtable和HashMap一样,是一个散列表,它存储的内容是键值对(key-value)映射。

那既然有了HashMap,为什么还要有Hashtable的出现?

Hashtable出现的原因 : 在集合类中HashMap是比较常用的集合对象,但是HashMap是线程不安全的(多线程环境下可能会存在问题)。为了保证数据的安全性我们可以使用Hashtable,但是Hashtable的效率低下。

而且,Hashtable 的函数都是同步的,这也就意味着它是线程安全的。它的key、value都不可以为null。

代码示例

import java.util.HashMap;
import java.util.Hashtable;

public class HashtableDemo 
    public static void main(String[] args) throws InterruptedException 
        Hashtable<String, String> hm = new Hashtable<>();
		// 线程1 哈希表进行操作
        Thread t1 = new Thread(() -> 
            for (int i = 0; i < 25; i++) 
                hm.put(i + "", i + "");
            
        );

		// 线程2 哈希表进行操作
        Thread t2 = new Thread(() -> 
            for (int i = 25; i < 51; i++) 
                hm.put(i + "", i + "");
            
        );

        t1.start();
        t2.start();

        System.out.println("----------------------------");
        // 为了t1和t2能把数据全部添加完毕
        Thread.sleep(1000);

        for (int i = 0; i < 51; i++) 
            System.out.println(hm.get(i + ""));
        //0 1 2 3 .... 50
    

运行结果如下:

1.2 ConcurrentHashMap简单介绍

​ ConcurrentHashMap出现的原因 : 在集合类中HashMap是比较常用的集合对象,但是HashMap是线程不安全的(多线程环境下可能会存在问题)。为了保证数据的安全性我们可以使用Hashtable,但是Hashtable的效率低下。

基于以上两个原因我们可以使用JDK1.5以后所提供的ConcurrentHashMap。

体系结构 :


其他Map也是继承与Map接口

代码示例

import java.util.Hashtable;
import java.util.concurrent.ConcurrentHashMap;

public class MyConcurrentHashMapDemo 
    public static void main(String[] args) throws InterruptedException 
        ConcurrentHashMap<String, String> hm = new ConcurrentHashMap<>(100);

        Thread t1 = new Thread(() -> 
            for (int i = 0; i < 25; i++) 
                hm.put(i + "", i + "");
            
        );


        Thread t2 = new Thread(() -> 
            for (int i = 25; i < 51; i++) 
                hm.put(i + "", i + "");
            
        );

        t1.start();
        t2.start();

        System.out.println("----------------------------");
        //为了t1和t2能把数据全部添加完毕
        Thread.sleep(1000);

        //0-0 1-1 ..... 50- 50

        for (int i = 0; i < 51; i++) 
            System.out.println(hm.get(i + ""));
        //0 1 2 3 .... 50
    

运行结果如下:

1.3 ConcurrentHashMap、HashMap、Hashtable对比:

  1. HashMap是线程不安全的。多线程环境下会有数据安全问题
  2. Hashtable是线程安全的,但是会将整张表锁起来,效率低下
  3. ConcurrentHashMap也是线程安全的,效率较高。 在JDK7和JDK8中,底层原理不一样。

以上是关于Hashtable与ConcurrentHashMap入门——简单使用的主要内容,如果未能解决你的问题,请参考以下文章

Hashtable与HashMap有啥区别?

HashMap与HashTable

HashMap与HashTable的区别

Collections.synchronizedMap()与ConcurrentHashMap的区别

HashMap与Hashtable

何时应该使用 Hashtable 与 HashMap