1、平时使用的ConCurrentHashMap会经常用到containsKey 与 containsValue。
但是使用 containsKey 与 containsValue 方法有很大不同
1、containsKey 会先根据key的hash算出所属的Segment 然后在该Segment 中进行搜索
2、containsValue 会去给Segment加锁,一旦搜索到就结束,搜索完毕会给Segment解锁 ,在Segment搜索的时候会给该Segment加锁(Segment extends ReentrantLock),所以containsValue 可能会对整个map进行搜索,也就是说该操作会锁定整个map,性能肯定会有所降低。
以上个人浅薄的理解,如有不对的地方请大家指正。
public boolean containsKey(Object key) {
Segment<K,V> s; // same as get() except no need for volatile value read
HashEntry<K,V>[] tab;
int h = hash(key);
long u = (((h >>> segmentShift) & segmentMask) << SSHIFT) + SBASE;
if ((s = (Segment<K,V>)UNSAFE.getObjectVolatile(segments, u)) != null &&
(tab = s.table) != null) {
for (HashEntry<K,V> e = (HashEntry<K,V>) UNSAFE.getObjectVolatile
(tab, ((long)(((tab.length - 1) & h)) << TSHIFT) + TBASE);
e != null; e = e.next) {
K k;
if ((k = e.key) == key || (e.hash == h && key.equals(k)))
return true;
}
}
return false;
}
public boolean containsValue(Object value) {
// Same idea as size()
if (value == null)
throw new NullPointerException();
final Segment<K,V>[] segments = this.segments;
boolean found = false;
long last = 0;
int retries = -1;
try {
outer: for (;;) {
if (retries++ == RETRIES_BEFORE_LOCK) {
for (int j = 0; j < segments.length; ++j)
ensureSegment(j).lock(); // force creation  给Segment加锁
}
long hashSum = 0L;
int sum = 0;
for (int j = 0; j < segments.length; ++j) {
HashEntry<K,V>[] tab;
Segment<K,V> seg = segmentAt(segments, j);
if (seg != null && (tab = seg.table) != null) {
for (int i = 0 ; i < tab.length; i++) {
HashEntry<K,V> e;
for (e = entryAt(tab, i); e != null; e = e.next) {
V v = e.value;
if (v != null && value.equals(v)) {
found = true;
break outer;
}
}
}
sum += seg.modCount;
}
}
if (retries > 0 && sum == last)
break;
last = sum;
}
} finally {
if (retries > RETRIES_BEFORE_LOCK) {
for (int j = 0; j < segments.length; ++j)
segmentAt(segments, j).unlock(); // 给Segment解锁
}
}
return found;
}

ConCurrentHashMap会经常用到containsKey 与 containsValue。相关推荐

  1. java集合框架中contains(),containsKey()和containsValue()的用法

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. java集合框架中contains(),containsKey()和containsValue()的 ...

  2. MAP使用containsKey和containsValue方法,验证键值对是否存在此KEY或VAL值。

    前言 在项目过程中,可能使用MAP集合返回结果集合,以前我会取指定KEY值,在取他的VALUE值,来获取最后结果.如果KEY值不存在还会取出NULL值.但是今天看到同事使用了containsKey和c ...

  3. java集合框架中contains(),containsKey()和containsValue()的用法:

    java集合框架中contains(),containsKey()和containsValue()的用法: List集合的contains()方法用于判断集合中包不包含某个元素,返回值是boolean ...

  4. containsKey和containsValue

    前言 在项目过程中,可能使用MAP集合返回结果集合,以前我会取指定KEY值,在取他的VALUE值,来获取最后结果.如果KEY值不存在还会取出NULL值.但是今天看到同事使用了containsKey和c ...

  5. JAVA集合框架中的常用集合及其特点、适用场景、实现原理简介

    JDK提供了大量优秀的集合实现供开发者使用,合格的程序员必须要能够通过功能场景和性能需求选用最合适的集合,这就要求开发者必须熟悉Java的常用集合类.本文将就Java Collections Fram ...

  6. Java Core系列之ConcurrentHashMap实现(JDK 1.7)

    ConcurrentHashMap类似Hashtable,是HashMap更高效的线程安全版本的实现.不同于Hashtable简单的将所有方法标记为synchronized,它将内部数组分成多个Seg ...

  7. [JDK1.6] JAVA集合 ConcurrentHashMap源码浅析

    文章目录 一 简介: ConcurrentHashMap 存储数据的结构与架构图 ConcurrentHashMap 的字段与常量 构造方法 存储数据 put(K, V) 获取数据 get(Objec ...

  8. hashmap的特性?HashMap底层源码,数据结构?Hashmap和hashtable ConcurrentHashMap区别?

    1.hashmap的特性? 允许空键和空值(但空键只有一个,且放在第一位) 元素是无序的,而且顺序会不定时改变 key 用 Set 存放,所以想做到 key 不允许重复,key 对应的类需要重写 ha ...

  9. JAVA-最常用的A题语法

    输出 System.out.println(""); if 语句 if(布尔表达式) {//如果布尔表达式为true将执行的语句 } if...else... 语句 if(布尔表达 ...

最新文章

  1. Community Server专题五:IHttpHandlerFactory
  2. pc端WINCE的安装包
  3. what is the thinking routine of the open source?
  4. python中unique_一个神奇的Python机器学习交互应用开放框架
  5. 为什么我那么努力,模电还是学不懂?
  6. 与python相关计算机基础知识
  7. 禁用计算机f1-f12,win10禁用F1至F12热键转为功能键的技巧
  8. linux sed 循环多行,linux sed 多行处理详细总结
  9. ImPan免费版 百度云网盘第三方不限速下载工具
  10. 通过mysqlnow()函数校正本地(windows)时间与服务器(linux)时间
  11. HDU2090 算菜价【水题】
  12. 超柔磨绒印花空调被(200*230cm) -凡客诚品工商银行团购专区- VANCL凡客诚品
  13. (十三)中介者模式详解(玄幻版)
  14. 卸载不了mysql2008_卸载SQL2008遇到问题(重启计算机失败、找不到SQL卸载程序)的解决办法...
  15. STM32F103代码远程升级(六)基于小米IoT开发者平台远程升级代码的实现
  16. 02-iOS蓝牙连接流程介绍
  17. 小米笔记本linux无线网失效,小米笔记本无线网络打不开怎么办
  18. NOIP2011提高组初赛不定项选择第5题
  19. The Client hold the Interface
  20. 常见的Hash算法(General Purpose Hash Function Algorithms)

热门文章

  1. C#网络编程的最佳实践
  2. C语言——Prim算法实现最小生成树
  3. 【MVC购物车】购买和加入购物车功能
  4. “降噪”与“匠心”兼得:索尼WH-1000XM4评测体验
  5. 将所有的碎片信息放进去的结构 ,大大减轻大脑的负担,更容易地解决问题
  6. 中兴n909android4.4,中兴n909强刷回官方rom系统的教程
  7. 闲鱼7月手机销量排行榜:iPhone稳占第一
  8. Linux ping本网段所有Ip
  9. android应用测试报告,Android 7.0应用兼容性测试报告,你get到多少姿势?
  10. ACM学习历程23——最小周期串问题