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-15.7 Map(2)-介绍HashMap的工作原理-put方法

这一章节我们来介绍HashMap的工作原理。1.HashMap的工作原理图下图引用自:http://www.admin10000.com/document/3322.html(1)HashMap初始化...

Java 1.8 HashMap 源码中 put()方法详解

在jdk1.7的时候,hashmap底层结构就是数组+链表的结构,如果发生冲突,即hashcode相同key也相同,但是value不同的话,那么就会放在底层数组的同一个下标处,官方话叫同一个桶内,以链...

利用Java的HashMap 改造C++ 的hash_map

  • 2011年10月26日 17:30
  • 11KB
  • 下载

Java 集合 2:HashMap(put方法的实现与哈希冲突)

HashMap 概念对于 Map ,最直观就是理解就是键值对,映射,key-value 形式。一个映射不能包含重复的键,一个键只能有一个值。平常我们使用的时候,最常用的无非就是 HashMap。Has...

Java HashMap的数据结构以及put和get方法

1 HashMap的数据结构 HashMap实际上是一个链表数组,也就是最外层是数组,数组的元素是链表。    2 HashMap的put方法: 源代码如下:   public V put(K ...

java HashMap的put

今天在写reduce函数的时候用HashMa

Java HashMap的put()方法、size()方法

先看一个问题,请修改下列代码,使其输出结果为注释后面的 public static void main(String[] args) { HashMap map = new HashM...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java Map初始化的一个错误:new HashMap().put("a", "b");
举报原因:
原因补充:

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