在Java中创建空映射的最佳方法

Jor*_*geO 103 java collections dictionary hashmap

我需要创建一个空地图.

if (fileParameters == null)
    fileParameters = (HashMap<String, String>) Collections.EMPTY_MAP;
Run Code Online (Sandbox Code Playgroud)

问题是上面的代码产生了这个警告: 类型安全:从Map映射到HashMap的未选中

创建此空地图的最佳方法是什么?

Jon*_*nik 217

1)如果Map可以是不可变的:

Collections.emptyMap()

// or, in some cases:
Collections.<String, String>emptyMap()
Run Code Online (Sandbox Code Playgroud)

有时,当编译器无法自动确定需要哪种Map时(这称为类型推断),您将不得不使用后者.例如,考虑一个声明如下的方法:

public void foobar(Map<String, String> map){ ... }
Run Code Online (Sandbox Code Playgroud)

将空Map直接传递给它时,您必须明确该类型:

foobar(Collections.emptyMap());                 // doesn't compile
foobar(Collections.<String, String>emptyMap()); // works fine
Run Code Online (Sandbox Code Playgroud)

2)如果您需要能够修改Map,那么例如:

new HashMap<String, String>()
Run Code Online (Sandbox Code Playgroud)

(正如tehblanx指出的那样)


附录:如果您的项目使用番石榴,您有以下替代方案:

1)不变的地图:

ImmutableMap.of()
// or:
ImmutableMap.<String, String>of()
Run Code Online (Sandbox Code Playgroud)

当然,与此相比,没有什么大的好处Collections.emptyMap().来自Javadoc:

此映射的行为和性能相当Collections.emptyMap(),并且主要用于代码的一致性和可维护性.

2)您可以修改的地图:

Maps.newHashMap()
// or:
Maps.<String, String>newHashMap()
Run Code Online (Sandbox Code Playgroud)

Maps包含类似的工厂方法,用于实例化其他类型的地图,例如TreeMapLinkedHashMap.


更新(2018):在Java 9或更高版本上,创建不可变空映射的最短代码是:

Map.of()
Run Code Online (Sandbox Code Playgroud)

使用...新的便利工厂方法JEP 269.


bas*_*ero 16

Collections.emptyMap()

  • 您应该(通常)避免声明其特定类型的对象并使用接口(或抽象父级).尽量避免"HashMap <String,String> foo;" 并使用"Map <String,String> foo;" 代替 (6认同)

And*_*eiM 9

如果您需要HashMap的实例,最好的方法是:

fileParameters = new HashMap<String,String>();
Run Code Online (Sandbox Code Playgroud)

由于Map是一个接口,因此如果要创建一个空实例,则需要选择一个实例化它的类.HashMap看起来和其他任何一样好 - 所以就这样使用它.


Pet*_*aný 7

或者Collections.emptyMap(),如果类型推断在您的情况下不起作用,
Collections.<String, String>emptyMap()