用Java创build空白地图的最佳方法

我需要创build一个空的地图。

if (fileParameters == null) fileParameters = (HashMap<String, String>) Collections.EMPTY_MAP; 

问题是上面的代码会产生这样的警告: types安全性:取消选中从映射到HashMap

什么是最好的方式来创build这个空的地图?

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

 Collections.emptyMap(); // or, in some cases: Collections.<String, String>emptyMap(); 

当编译器不能自动确定需要什么types的Map(这称为types推断 )时,您将不得不使用后者。 例如,考虑一个像这样声明的方法:

 public void foobar(Map<String, String> map){ ... } 

当直接将空Map传递给它时,必须明确这个types:

 foobar(Collections.emptyMap()); // doesn't compile foobar(Collections.<String, String>emptyMap()); // works fine 

2)如果你需要能够修改地图,那么例如:

 new HashMap<String, String>(); 

(正如tebblanx指出的那样 )


附录 :如果您的项目使用番石榴 ,您有以下select:

1)不可变的地图:

 ImmutableMap.of(); // or: ImmutableMap.<String, String>of(); 

当然,与Collections.emptyMap()相比,这里没有什么大的好处。 从Javadoc :

这个映射的行为和执行与Collections.emptyMap()相当,主要是为了代码的一致性和可维护性。

2)你可以修改的地图:

 Maps.newHashMap(); // or: Maps.<String, String>newHashMap(); 

Maps包含类似的工厂方法来实例化其他types的地图,如TreeMapLinkedHashMap

Collections类的emptyMap方法 。

Collections.emptyMap()

如果你需要一个HashMap的实例,最好的方法是:

 fileParameters = new HashMap<String,String>(); 

由于Map是一个接口,如果你想创build一个空的实例,你需要select一些实例化它的类。 HashMap看起来和其他任何东西一样好,所以就使用它。

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

关于什么 :

Map <String,String> s = Collections.emptyMap();

由于在许多情况下空映射用于空安全devise,因此可以使用nullToEmpty实用程序方法:

 class MapUtils { static <K,V> Map<K,V> nullToEmpty(Map<K,V> map) { if (map != null) { return map; } else { return Collections.<K,V>emptyMap(); // or guava ImmutableMap.of() } } } 

类似的设置:

 class SetUtils { static <T> Set<T> nullToEmpty(Set<T> set) { if (set != null) { return set; } else { return Collections.<T>emptySet(); } } } 

并列出:

 class ListUtils { static <T> List<T> nullToEmpty(List<T> list) { if (list != null) { return list; } else { return Collections.<T>emptyList(); } } }