为什么在创建Map时会出现IllegalArgumentException?

use*_*551 7 java collections java-9

我正在尝试创建一个城市和温度的地图,但它正在抛出一个IllegalArgumentException.这是我正在做的事情:

Map<String, Integer> tempMap = Map.of("London", 13, "Paris", 17, "Amsterdam", 13, 
                                      "Madrid", 21, "Rome", 19, "London", 13, "Bonn", 14,
                                      "Moscow", 7, "Barcelona", 20, "Berlin", 15);
Run Code Online (Sandbox Code Playgroud)

如果我逐个添加它们就没问题了:

Map<String, Integer> tempMap = new Hashmap<>(); // or LinkedHashMap
tempMap.put("London", 13);
tempMap.put("Madrid", 21);
tempMap.put("Moscow", 7);
// etc.
Run Code Online (Sandbox Code Playgroud)

为什么会这样?内容应该是不一样的吗?

use*_*551 11

为什么会这样?

因为实例化中有一个重复的键:"London".在一成不变的静态工厂MapSet不允许重复(映射条目是重复的,如果它的关键是重复的) -在创建期间不-因此根本没有.这种限制表现为抛出IllegalArgumentException.

虽然从技术上讲你没有做任何不兼容的事情,但是图书馆的作者认为这是一个(可能是复制粘贴)的错误.为什么要添加一个项目只是为了稍后覆盖几行?

这让我想到......

如果我逐个添加它们就没问题了

这就是你的想法,只有你可能没有意识到你的地图将包含少于你输入的1个条目.重复条目会覆盖前一个条目("最后一个胜利"规则).当因此发生错误时,会出现很多问号.出于这个原因,快速失败的方法有其优点(虽然我不会提倡它只是更好).

作为提示,在创建地图时,如果您将其格式化,则更容易看到其内容:

Map<String, Integer> tempMap = Map.of(
        "London",    13,
        "Paris",     17,
        "Amsterdam", 13,
        "Madrid",    21,
        "Rome",      19,
        "London",    13, // !
        "Bonn",      14,
        "Moscow",     7,
        "Barcelona", 20,
        "Berlin",    15
);
Run Code Online (Sandbox Code Playgroud)