前提是: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. struts2之标签库

    使用Struts2标签的准备工作: 导入Struts2标签库,该标签定义文件位于 struts2-core-2.3.16.3.jar 的 METE-INF下的struts-tag.tld文件. < ...

  2. Oracle_11g中解决被锁定的scott用户的方法

    在安装完Oracle10g和创建完oracle数据库之后,想用数据库自带的用户scott登录,看看连接是否成功. 问题: 在cmd命令中,用“sqlplus  scott/ tiger”登录时,老是提 ...

  3. java 二进制、位运算、和移位运算符(2013-07-30-bd 写的日志迁移

    二进制是逢2进位的进位制,0.1是基本算符, 1字节=8位 比如 int a =1 ;int 占4个字节在计算机里表示为: java中的4个位运算,分别是“按位与&.按位或|.按位异或^,按位 ...

  4. JZOJ| 5910. DuLiu

    Description          LF是毒瘤出题人中AK IOI2019,不屑于参加NOI的唯一的人.他对人说话,总是满口垃圾题目者也,教人半懂不懂的.因为他姓李,别人便从QQ群上的“毒瘤李F ...

  5. DSP资源分享贴

    DSP资源分享 [2017.5.16 更新] 分享资源共同学习.以前的资源很多人都说用不了了,我会陆续补充,逐步完善.这里不单单分享DSP的,设计基础的,还有其他的电子相关的比较好的资源吧主都和您分享 ...

  6. 交叉编译qt5.6

    按照网上的攻略编译QT5.6 https://www.lijingquan.net/2016/07/08/build-kernel-busybox-qt5-6-tslib-imx28/ 出现问题,找不 ...

  7. C语言数组篇(五)多级指针和二维数组指针的区别

    多级指针   以二级指针为例 二级指针的由来是 指针数组 的指针形式. int *p[10] 读取的顺序是 p[] --> 10个空间的数组 * p[] --> 这10个空间的数组里面存放 ...

  8. Git-Git分支

    代码管理之殇 分支是代码管理的利器.如果没有有效的分支管理,代码管理就适应不了复杂的开发过程和项目的需要.在实际的项目实践中,单一分支的单线开发模式还远远不够,因为: 成功的软件项目大多要经过多个开发 ...

  9. AS3项目基础框架搭建分享robotlegs2 + starling1.3 + feathers1.1

    这个框架和我之前使用robotlegs1版本的大体相同,今天要写一个新的聊天软件就把之前的框架升级到了2.0并且把代码整理了一下. 使用适配器模式使得starling的DisplayObject和fl ...

  10. Pascal 杨辉三角

    用于打印杨辉三角的程序,有多种算法仅提供一种 PRogram yh (input,ouput);var  m,n,c:integer;Begin For m:=0 TO 10 Do   Begin   ...