在Java中创建空白地图的最佳方法


117

我需要创建一个空地图。

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

问题是上面的代码会产生以下警告: 类型安全性:未经检查的从Map转换为HashMap

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


您为fileParameters声明的类型是什么?
jjnguy

您可能还会得到ClassCastException。
Tom Hawtin-抢险

1
fileParameters应该是一个Map,而不是HashMap。
Steve Kuo

Answers:


241

1)如果地图是不可变的:

Collections.emptyMap()

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

有时,当编译器无法自动确定需要哪种Map时(有时称为type Inference),您将不得不使用后者。例如,考虑这样声明的方法:

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

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

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

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

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也包含用于实例化其他类型地图的类似工厂方法,例如TreeMapLinkedHashMap


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

Map.of()

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


在大多数情况下,类型推断有效(即地图= Collections.emptyMap()的作品。)
塞巴斯蒂安RoccaSerra

是啊,没错。我将答案编辑得更全面。
Jonik

16

问题在于此地图只能应用于地图对象,而不能应用于HashMap
JorgeO,2009年

7
您(通常)应避免声明其特定类型的对象,而应使用接口(或抽象父对象)。尽量避免使用“ HashMap <String,String> foo;”。并使用“ Map <String,String> foo;” 相反
TofuBeer


10

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

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

由于Map是接口,因此如果要创建一个空实例,则需要选择一些实例化该类的类。HashMap看起来和其他任何一个一样好-因此只需使用它即可。


7

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


2

由于在很多情况下,空映射用于空安全设计,因此可以利用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();
    }
  }

}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.