📜  HashMap 和 ConcurrentHashMap 的区别

📅  最后修改于: 2022-05-13 01:54:38.895000             🧑  作者: Mango

HashMap 和 ConcurrentHashMap 的区别

HashMap 是传统集合下的类,而 ConcurrentHashMap 是并发集合下的类,除此之外,它们之间还有各种不同之处:

  • HashMap 本质上是非同步的,即 HashMap 不是线程安全的,而 ConcurrentHashMap 本质上是线程安全的。
  • HashMap 性能相对较高,因为它本质上是非同步的,并且可以同时执行任意数量的线程。但是 ConcurrentHashMap 性能有时会很低,因为有时线程需要等待 ConcurrentHashMap。
  • 当一个线程正在迭代 HashMap 对象时,如果其他线程尝试添加/修改 Object 的内容,那么我们将得到运行时异常ConcurrentModificationException 。而在 ConcurrentHashMap 中,在迭代时执行任何修改时我们不会得到任何异常。

    使用哈希映射

    // Java program to illustrate
    // HashMap drawbacks
    import java.util.HashMap;
      
    class HashMapDemo extends Thread
    {
        static HashMap l=new HashMap();
      
        public void run()
        {
              
          
            try
            {
                Thread.sleep(1000);
                // Child thread trying to add
                // new element in the object
                l.put(103,"D");
            }
            catch(InterruptedException e)
            {
                System.out.println("Child Thread going to add element");
            }
        }
      
        public static void main(String[] args) throws InterruptedException
        {
            l.put(100,"A");
            l.put(101,"B");
            l.put(102,"C");
            HashMapDemo t=new HashMapDemo();
            t.start();
              
            for (Object o : l.entrySet()) 
            {
                Object s=o;
                System.out.println(s);
                Thread.sleep(1000);
            }
            System.out.println(l);
        }
    }
    

    输出:

    100=A
    Exception in thread "main" java.util.ConcurrentModificationException
    

    使用 ConcurrentHashMap

    // Java program to illustrate
    // HashMap drawbacks
    import java.util.HashMap;
    import java.util.concurrent.*;
      
    class HashMapDemo extends Thread
    {
        static ConcurrentHashMap l = 
                           new ConcurrentHashMap();
      
        public void run()
        {
          
            // Child add new element in the object
            l.put(103,"D");
              
            try
            {
                Thread.sleep(2000);
            }
            catch(InterruptedException e)
            {
                System.out.println("Child Thread going to add element");
            }
        }
          
        public static void main(String[] args) throws InterruptedException
        {
            l.put(100,"A");
            l.put(101,"B");
            l.put(102,"C");
            HashMapDemo t=new HashMapDemo();
            t.start();
              
            for (Object o : l.entrySet()) 
            {
                Object s=o;
                System.out.println(s);
                Thread.sleep(1000);
            }
            System.out.println(l);
        }
    }
    

    输出:

    100=A
    101=B
    102=C
    103=D
    {100=A, 101=B, 102=C, 103=D}
    
  • 在 HashMap 中,key 和 values 允许为 null 值,而在 ConcurrentHashMap 中,key 和 value 不允许为 null 值,否则我们将得到 Run-time 异常NullPointerException。

    使用哈希映射

    //Java Program to illustrate ConcurrentHashMap behaviour
    import java.util.*;
    class ConcurrentHashMapDemo
    {
        public static void main(String[] args)
        {
            HashMap m=new HashMap();
            m.put(100,"Hello");
            m.put(101,"Geeks");
            m.put(102,"Geeks");
            m.put(null,"World");
            System.out.println(m);
        }
    } 
    

    输出:

    {null=World, 100=Hello, 101=Geeks, 102=Geeks}
    

    使用 ConcurrentHashMap

    //Java Program to illustrate HashMap behaviour
    import java.util.concurrent.*;
    class ConcurrentHashMapDemo
    {
        public static void main(String[] args)
        {
            ConcurrentHashMap m=new ConcurrentHashMap();
            m.put(100,"Hello");
            m.put(101,"Geeks");
            m.put(102,"Geeks");
            m.put(null,"World");
            System.out.println(m);
        }
    } 
    

    输出:

    Exception in thread "main" java.lang.NullPointerException
    
  • HashMap 是在 JDK 1.2 中引入的,而 ConcurrentHashMap 是由 SUN Microsystem 在 JDK 1.5 中引入的。