Java Map初始化的一个错误:new HashMap().put("a", "b");

原创 2017年09月16日 19:34:53

今天在使用PowerMock进行代码测试用例编写的时候,需要新建一个map,当时脑一抽,写成了:

Map<String, Object> testMap = new HashMap().put("a", "b");

然后收到了IDE的友善提醒:

Incompatible types.
 Required: java.util.Map<java.lang.String, java.lang.Object>
 Found: java.lang.Object

习惯了接受IDE的建议,当时想都没想,看也没看,就直接Alt + Enter对代码进行了修改,然后编译器帮我改成了:

Map<String, Object> testMap = (Map<String, Object>) new HashMap<>().put("a", "b");

并顺带提醒:Cast to 'java.util.Map<java.lang.String, java.lang.Object>'
我继续欢快地写着测试,最后一运行,test error。

gg

看了看报错原因,我希望得到的是我刚刚新建的testMap,结果得到的却是null。

最后debug了一下,发现被测试的代码逻辑并没有问题,问题的症结在我新建出来的testMap被我给初始化成了null……

回头看我的代码,一开始写的是Map<String, Object> testMap = new HashMap().put("a", "b");,则testMap被初始化成了put(K, V)的返回值。put接口描述如下:

put

public V put(K key, V value)
在此映射中关联指定值与指定键。如果该映射以前包含了一个该键的映射关系,则旧值被替换。
指定者:
接口 Map<K,V> 中的 put
覆盖:
类 AbstractMap<K,V> 中的 put
参数:
key - 指定值将要关联的键
value - 指定键将要关联的值
返回:
与 key 关联的旧值;如果 key 没有任何映射关系,则返回 null。(返回 null 还可能表示该映射之前将 null 与 key 关联。)

很明显,new HashMap().put("a", "b")返回的根本就不是一个map,而是put的返回值,V。这里的K是String,而V是Object,因此返回的是一个Object。再结合前面的Map

Map<String, Object> testMap = null;

尴尬……
脑抽一时爽,debug火葬场……

如果想新建map的时候初始化,可以使用匿名内部类:

Map map = new HashMap() { 
  { 
  put("Name", "puppylpg"); 
  } 
};

或者使用Collections和Arrays去初始化集合框架:

List<String> keys = Collections.unmodifiableList(
                new ArrayList<>(Arrays.asList("hello@world", "good@bye", "love@you")));
版权声明:本文为博主原创文章,未经博主允许不得转载。

Java Map初始化的一个错误:new HashMap().put("a", "b");

今天在使用PowerMock进行代码测试用例编写的时候,需要新建一个map,当时脑一抽,写成了:Map testMap = new HashMap().put("a", "b");然后收到了IDE的友...
  • puppylpg
  • puppylpg
  • 2017年09月16日 19:34
  • 523

new HashMap(){{put("id", "001");}}的解释

一、HashMap的初始化 1、HashMap 初始化的文艺写法    HashMap 是一种常用的数据结构,一般用来做数据字典或者 Hash 查找的容器。普通青年一般会这么初始化:   ...
  • luman1991
  • luman1991
  • 2016年11月04日 14:39
  • 4634

Java的HashMap如何合理地初始化

Java的HashMap是如何实现的: HashMap mapJdK = new HashMap(); 上述代码在原则上是合法的java代码,但是这个HashMap并没有合理地初始化。 在这...
  • willproud
  • willproud
  • 2013年11月18日 18:08
  • 3948

new HashMap().put(key,value)返回值为null,已解决

今天的问题是我直接想在方法里直接list.add(new HashMap().put(key,value)),本以为list里有值,结果返回为空; 测试了一下: System.out.println(...
  • luman1991
  • luman1991
  • 2016年08月31日 14:43
  • 1835

Java 中 HashMap 初始化时赋值

1、HashMap 初始化的文艺写法 HashMap 是一种常用的数据结构,一般用来做数据字典或者 Hash 查找的容器。普通青年一般会这么初始化: HashMap map = new Has...
  • we_shell
  • we_shell
  • 2015年06月03日 13:48
  • 39474

Map的new为什么是Map map=new HashMap();而不是new Map();?因为map是个接口,而接口不能被实例化!HashMap是map接口的实现类!

问题: 请问Map map=new HashMap(); 为什么是这样,而不是Map map=new Map(); 答案: Map是接口,hashMap是Map的一种实现。接口不能被实例化。 ...
  • Ideality_hunter
  • Ideality_hunter
  • 2016年05月26日 16:03
  • 6981

设计HashMap中元素put顺序和输出顺序相同

因此,我们put进去元素的时候,元素因为自己的hashcode值分配到的存储位置而导致了元素的无序。所以要使得put进去元素和输出元素的顺序一样,只需要我们put进去的hashcode值和我们put的...
  • nju_mc
  • nju_mc
  • 2016年10月26日 09:47
  • 3354

细说匿名内部类方式创建线程、初始化HashMap

先来看看使用匿名内部类创建线程和初始化HashMap的示例代码:使用匿名内部类创建线程:new Thread() { public void run() { System.ou...
  • javaloveiphone
  • javaloveiphone
  • 2016年08月30日 16:12
  • 1641

java4Android(22)Map/HashMap的方法:put()/set()

import java.util.Map; import java.util.HashMap; class test{ public static void main(String[] ar...
  • u013225534
  • u013225534
  • 2015年09月27日 20:02
  • 1041

Map(一)之HashMap(java8)

概述【本文基于jdk1.8.0_60】  在我们日常开发中,HashMap被使用到的概率非常高。它是一种非常典型的数据结构。我们应该都知道Map是存储key-value键值对的集合类,也就是说元素是成...
  • lchpersonal521
  • lchpersonal521
  • 2016年07月13日 16:26
  • 4475
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java Map初始化的一个错误:new HashMap().put("a", "b");
举报原因:
原因补充:

(最多只允许输入30个字)