我需要创建一个空白地图。
if (fileParameters == null) fileParameters = (HashMap<String, String>) Collections.EMPTY_MAP;
问题是上面的代码产生了这个警告: 类型安全: 未检查从 Map 到 HashMap 的转换
创建这个空白地图的最佳方法是什么?
如果需要 HashMap 的实例,最好的方法是:
fileParameters = new HashMap<String,String>();
因为 Map 是一个接口,所以如果您想创建一个空实例,就需要选择一些实例化它的类。HashMap 看起来和其他 HashMap 一样好——所以只要使用它就可以了。
Collection 类 的 emptyMap 方法。
Collections.emptyMap ()
无论是 Collections.emptyMap(),或者如果类型推断在您的情况下不起作用, Collections.<String, String>emptyMap()
Collections.emptyMap()
Collections.<String, String>emptyMap()
1) 如果地图是不可变的:
Collections.emptyMap() // or, in some cases: Collections.<String, String>emptyMap()
当编译器无法自动找出需要什么类型的 Map 时(称为 类型推断) ,有时必须使用后者。例如,考虑这样声明的一个方法:
public void foobar(Map<String, String> map){ ... }
当直接将空 Map 传递给它时,必须明确说明类型:
foobar(Collections.emptyMap()); // doesn't compile foobar(Collections.<String, String>emptyMap()); // works fine
2) 如果你需要修改 Map,例如:
new HashMap<String, String>()
(以 TehBlanx 指出为准)
附录 : 如果您的项目使用 番石榴,您有以下选项:
1) 永恒地图:
ImmutableMap.of() // or: ImmutableMap.<String, String>of()
当然,与 Collections.emptyMap()相比,这里没有太大的好处。 从 Javadoc 来的:
此映射的行为和性能与 Collections.emptyMap()相当, 并且主要是为了您的一致性和可维护性 密码。
2) 可以修改的映射:
Maps.newHashMap() // or: Maps.<String, String>newHashMap()
Maps 包含类似的工厂方法,用于实例化其他类型的映射,例如 TreeMap或 LinkedHashMap。
Maps
TreeMap
LinkedHashMap
更新(2018) : 在 爪哇9或更新版本上,创建一个不可变的空映射的最短代码是:
Map.of()
用的是 JEP 269台的新 便利的工厂方法。
那么:
Map < String,String > s = Collections.emptyMap () ;
因为在许多情况下,一个空映射用于零安全设计,您可以利用 nullToEmpty实用程序方法:
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(); } } }
你可使用:
Collections<String, String>.emptyMap();