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

时间:2017-10-07 12:40:49

标签: 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);

如果我逐一添加它们就没有问题:

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

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

2 个答案:

答案 0 :(得分:11)

  

为什么会这样?

因为您的实例化中有一个重复的密钥:"London"MapSet的{​​{3}}不允许重复(如果地图条目的密钥重复,则地图条目重复) - 不在创建时间内 - 因此根本不重复。抛出IllegalArgumentException

表明了这种限制

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

这让我想到......

  

如果我逐一添加它们就没有问题

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

作为提示,在创建地图时,如果您对其进行格式化,则可以更轻松地查看其内容:

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
);

答案 1 :(得分:3)

Map.of()

中所述
  

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

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

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