前提是:Map可以出现在k与v的映射中,v为null的情况, 所以containsKey出现更加必要。

map.get(key)是得到的key所对应的value值。

map.contains(key)是判断是否存在这个key,即判断是否存在指定的键名key。

Map集合允许值对象为null,并且没有个数限制,所以当get()方法的返回值为null时,可能有两种情况,一种是在集合中没有该键对象,另一种是该键对象没有映射任何值对象,即值对象为null。因此,在Map集合中不应该利用get()方法来判断是否存在某个键,而应该利用containsKey()方法来判断,例如下面的例子。

下面的代码首先创建一个由HashMap类实现的Map集合,并依次向Map集合中添加一个值对象为null和“马先生”的映射;然后分别通过get()和containsKey()方法执行这两个键对象;最后执行一个不存在的键对象。关键代码如下:

  1. <span style="font-size:18px;">import java.util.HashMap;
  2. import java.util.Map;
  3. public class TestMapKey {
  4. public static void main(String[] args) {
  5. Map<Integer, String> map = new HashMap<Integer, String>();
  6. map.put(220180, null);
  7. map.put(220181, "马先生");
  8. System.out.println("get()方法的返回结果:");
  9. System.out.print("------ " + map.get(220180));
  10. System.out.print("    " + map.get(220181));
  11. System.out.println("    " + map.get(220182));
  12. System.out.println("containsKey()方法的返回结果:");
  13. System.out.print("------ " + map.containsKey(220180));
  14. System.out.print("    " + map.containsKey(220181));
  15. System.out.println("    " + map.containsKey(220182));
  16. }
  17. }
  18. </span>

执行上面的代码,在控制台将输出如下信息:

get()方法的返回结果:

------ null    马先生    null
containsKey()方法的返回结果:
------ true    true    false

结论:Map集合中不应该利用get()方法来判断是否存在某个键,因为可能map的key值存在但value的值为null

今天被这个坑了,记录一下

附加注意:

  1. Map<String, Object> channelMap = new HashMap<String, Object>();
  2. channelMap.put("1", "online");
  3. Map<String, Object> map = new HashMap<String, Object>();
  4. map.put("vt", 1);
  5. if(channelMap.containsKey(map.get("vt"))) {
  6. System.out.print("success");
  7. } else {
  8. System.out.print("fail");
  9. }

输出为fail

感觉问题在于containsKey里面的值类型为Object,而channelMap的key类型是String,类型不能自动转换,所以就匹配失败。

代码改为

  1. Map<String, Object> channelMap = new HashMap<String, Object>();
  2. channelMap.put("1", "online");
  3. Map<String, Object> map = new HashMap<String, Object>();
  4. map.put("vt", 1);
  5. if(channelMap.containsKey(map.get("vt")+"")) {
  6. System.out.print("success");
  7. } else {
  8. System.out.print("fail");
  9. }

输出为success,结果正常

MAP的get与containskey的更多相关文章

  1. Java—集合框架 List和Set的contains()以及Map的containsKey()、containsValue()

    如何判断集合中是否存在某个元素——contains() 1.List的contains(obj)方法 实际上,List调用contains(Object obj)方法时,会遍历List中的每一个元素, ...

  2. IMap 对map的功能的强化

    为了解决表单提交获得数据的方便性,我们将map的功能进行加强,表单提交的数据会自动将页面数据放入PageData对象中,当从页面获取数据时 new的时候要传request.request.getPar ...

  3. Map 基础用法

    import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Set; p ...

  4. 集合框架四(Map)

    Map的主要实现类: --HashMap:Map的主要实现类(掌握) --LinkedHashMap:使用链表维护添加进Map中的顺序,遍历时按添加时的顺序遍历 --TreeMap:按照添加进Map中 ...

  5. Java学习---Map的学习

    1. Map 1.1. map中的方法 1.2. Map.Entry 对于集合来讲,就是把kye-value的数据保存在了Map.Entry的实例之后,再在Map集合中插入了一个Map.Entry的实 ...

  6. java基础——Map集合

    Map以键值对的形式存储数据,其中Map.entry,是Map的内部类,它用来描述Map中的键值对.Map是一个接口,HashMap是他的一个实现类 Map中有几个重要的方法: get(Object ...

  7. Java之Map接口(双列集合)

    Map集合概述 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射.Java提供了专门的集合类用来存放这种对象关系的对 ...

  8. map集合中取出分类优先级最高的类别名称

    import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.Map ...

  9. java之Map和Collection

    java中保存对象的容器可分为两类: 1.Map.Map是以键值对的形式来保存一组对象,可以通过键来查找值. 2.Collection.用来保存独立对象的序列.Collection又可分为三种类型: ...

随机推荐

  1. tomcat7下载地址

    tomcat7下载地址:https://tomcat.apache.org/download-70.cgi

  2. axios进行ajax请求得不到数据,cookie无法携带问题

    这个坑也是很早之前踩过,今天做项目的时候居然忘了,怎么都拿不到数据,果然好记性不如烂笔头,决定写篇博客来祭奠下我的猪脑子: 原因可能就是你发送请求的时候,需要设置cookie,然而你的cookie并没 ...

  3. Fiddler(一)

    Fiddler:学习scrapy,不只是满足于网页上爬去信息的成功乐趣,现在开始接触爬去手机信息了,不好解决,知道过程不会轻松,但自己想去尝试.QAQ 写这篇博客是基于以下的几位大神学习笔记,我只是做 ...

  4. python__系统 : 进程

    在类unix操作系统下,可以用 os.fork() 创建一个新的进程,windows系统不可以: import os ret = os.fork() print('ret=%d' % ret) : p ...

  5. python3 练习题100例 (二十)

    #!/usr/bin/env python3# -*- coding: utf-8 -*-"""练习二十:判断一个年份是否是闰年公历闰年计算方法:1.普通年能被4整除且不 ...

  6. 对文件 I/O,标准 I/O 的缓冲的理解

    1.标准I/O缓冲区 要理解标准I/O,就要先知道文件I/O的业务逻辑. 下面图示为文件I/O 如执行下面的代码: write(fd, buf2, sizeof(buf2)); 图中 buf:就是bu ...

  7. 笔记-python -asynio

    笔记-python -asynio 1.      简介 asyncio是做什么的? asyncio is a library to write concurrent code using the a ...

  8. HDU 4405 Aeroplane chess(期望dp)

    Aeroplane chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  9. 调试bug 技巧

    两天,一个小bug 我调试了两天,最终调试成功了.还是在别人的帮助下. 问题是刷新相关的.当用户登录了,其他的页面都要刷新.也就是加上一些参数. 但是有一个fragment一直加不上,其他挨着的两个都 ...

  10. Dragger 2遇到的坑 Dragger2详解 Dragger2学习最好的资料

    我是曹新雨,我为自己代言.现在的菜鸟,3年以后我就是大神.为自己加油.微信:aycaoxinyu Dragger2是什么,我就不再说了.资料一堆,而且里面的注解什么意思,我推荐两篇文章,这两篇都是我精 ...