为什么我在创建Map时会收到IllegalArgumentException?

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

 Map tempMap = Map.of("London", 13, "Paris", 17, "Amsterdam", 13, "Madrid", 21, "Rome", 19, "London", 13, "Bonn", 14, "Moscow", 7, "Barcelona", 20, "Berlin", 15); 

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

 Map tempMap = new Hashmap(); // or LinkedHashMap tempMap.put("London", 13); tempMap.put("Madrid", 21); tempMap.put("Moscow", 7); // etc. 

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

为什么会这样?

因为实例化中有一个重复的键: "London"MapSet的不可变静态工厂不允许重复(如果映射条目的键是重复的,则映射条目是重复的) – 不是在创建期间 – 因此根本不是。 抛出的IllegalArgumentException表明了这种限制。

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

这让我…

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

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

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

 Map tempMap = Map.of( "London", 13, "Paris", 17, "Amsterdam", 13, "Madrid", 21, "Rome", 19, "London", 13, // ! "Bonn", 14, "Moscow", 7, "Barcelona", 20, "Berlin", 15 ); 

Map.of()中所述

他们在创建时拒绝重复密钥。 传递给静态工厂方法的重复键导致IllegalArgumentException

因为,每个奇数参数是键,偶数是Map值。 您需要确保odd-number参数是唯一的。

另一方面, Map.put将替换相同键的旧值。