`
eclipse07
  • 浏览: 21151 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

HashMap 和 HashTable

 
阅读更多

区别
  • HashTable 与 HashMap 的区别主要在于 HashTable 是同步的,而 HashMap 不是同步的。
  • HashTable 在 get(), put(), remove() 等方法都加上了 synchronized 关键字进行同步。这样的效率确实不高。
  • HashMap 如果想使用同步版的,可以使用 Collections.synchronizedMap(new HashMap()) 来获取同步版。具体实现也就是添加了一个 Object,然后调用 get(), put() 等方法时都先锁定这个 Object。

误区
  • 同步的不代表是线程安全的,比如下面的代码。由于这个事务是由多个操作组成的,如果一个线程在执行完判断 containKey 后另外一个线程已经插入了数据,这时再执行就要杯具了。


public void operate() {
   if (!map.containKey("something")) {
       map.put("key", "value");
   }
}


不过如果是 ConcurrentHashMap 针对这种情况作了处理,它的父接口 ConcurrentMap 提供了一个 putIfAbsent 方法,这个方法也是原子操作的。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics