142

我需要创建一个空地图。

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

问题是上面的代码产生了这个警告: Type safety: Unchecked cast from Map to HashMap

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

4

7 回答 7

284

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)如果您需要能够修改地图,那么例如:

new HashMap<String, String>()

(正如tehblanx 指出的那样


附录:如果您的项目使用Guava,您有以下选择:

1)不可变映射:

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

当然,与Collections.emptyMap(). 从 Javadoc

此映射的行为和性能与 类似Collections.emptyMap(),并且主要是为了代码的一致性和可维护性而更可取。

2)您可以修改的地图:

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

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


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

Map.of()

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

于 2009-03-11T20:10:49.347 回答
21

Collections.emptyMap()

于 2009-03-11T20:08:43.923 回答
15

Collections 类的 emptyMap 方法

于 2009-03-11T20:08:42.177 回答
10

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

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

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

于 2009-03-11T20:07:16.877 回答
7

或者Collections.emptyMap(),如果类型推断不适用于您的情况,
Collections.<String, String>emptyMap()

于 2009-03-11T20:10:27.180 回答
2

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

}
于 2012-04-14T15:44:24.090 回答
1

关于什么 :

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

于 2009-03-11T20:12:30.873 回答