用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的地图,如TreeMap
或LinkedHashMap
。
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(); } } }