• HashMap和Hashtable的区别


    HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。 HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。 另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。 由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。 HashMap不能保证随着时间的推移Map中的元素次序是不变的。

    HashMap可以通过下面的语句进行同步: 
    Map m = Collections.synchronizeMap(hashMap); 
    结论

    Hashtable和HashMap有几个主要的不同:线程安全以及速度。仅在你需要完全的线程安全的时候使用Hashtable,而如果你使用Java 5或以上的话,请使用ConcurrentHashMap吧。

    ConcurrentHashMap的锁分段技术

    HashTable容器在竞争激烈的并发环境下表现出效率低下的原因,是因为所有访问HashTable的线程都必须竞争同一把锁,那假如容器里有多把锁,每一把锁用于锁住容器中的一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率,这就是ConcurrentHashMap所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的数据也能被其他线程访问。

  • 相关阅读:
    [leetcode] Rotate Image
    64位Ubuntu14.04搭建ADT开发环境
    Android开源框架之SwipeListView导入及模拟QQ侧滑
    [LeetCode] Compare Version Numbers
    Android平台之不预览获取照相机预览数据帧及精确时间截
    Android开发之打开闪光灯录制视频
    Android设置选项开发及自定义Preference样式
    Android平台上使用气压传感器计算海拔高度
    JAVA语言对比C++语言的几个优点和自身的关键特性
    数据结构二、线性表
  • 原文地址:https://www.cnblogs.com/feicheninfo/p/9662820.html
Copyright © 2020-2023  润新知