HashMap与HashTable的区别

来源:互联网 发布:淘宝下载windows10 编辑:程序博客网 时间:2024/05/22 21:42

HashMap与HashTable

1. HashMap与HashTable的区别

HashMap 线程不安全 允许有null的键和值 效率高一点 方法不是Synchronize的要提供外同步 有containsvalue和containsKey方法 HashMap 是Java1.2 引进的Map interface 的一个实现 HashTable 线程安全 不允许有null的键和值 效率稍低 方法是是Synchronize的 有contains方法方法 Hashtable 继承于Dictionary 类

2. 如何线程安全的使用HashMap

  1. 这个问题其实就是在问HashMap,Hashtable,ConcurrentHashMap 和 synchronized Map 的原理和区别
  2. HashMap不是线程安全的;Hashtable 线程安全,但效率低,因为是 Hashtable 是使用 synchronized 的,所有线程竞争同一把锁;而 ConcurrentHashMap 不仅线程安全而且效率高,因为它包含一个 segment 数组,将数据分段存储,给每一段数据配一把锁,也就是所谓的锁分段技术
  3. 三种方式
    Hashtable
    ConcurrentHashMap
    Synchronized Map
//Hashtable  Map<String, String> hashtable = new Hashtable<>();  //synchronizedMap  Map<String, String> synchronizedHashMap = Collections.synchronizedMap(new HashMap<String, String>());  //ConcurrentHashMap  Map<String, String> concurrentHashMap = new ConcurrentHashMap<>();  

Hashtable

public synchronized V get(Object key) {         // 省略实现      }  public synchronized V put(K key, V value) {      // 省略实现      }  

所以当一个线程访问 HashTable 的同步方法时,其他线程如果也要访问同步方法,会被阻塞住。举个例子,当一个线程使用 put 方法时,另一个线程不但不可以使用 put 方法,连 get 方法都不可以,好霸道啊!!!so~~,效率很低,现在基本不会选择它了

ConcurrentHashMap

ConcurrentHashMap使用分段锁技术,将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问,能够实现真正的并发访问。如下图是ConcurrentHashMap的内部结构图:
ConcurrentHashMap的内部结构图