ChatGPT解决这个技术问题 Extra ChatGPT

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

我需要创建一个空地图。

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

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

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

您为 fileParameters 声明的类型是什么?
你也可能会得到一个 ClassCastException。
fileParameters 应该是 Map 而不是 HashMap。

J
Jonik

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 pointed out

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

1)不可变映射:

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

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

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

2)您可以修改的地图:

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

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

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

Map.of()

...使用来自 JEP 269 的新 convenience factory methods。 😎


在大多数情况下,类型推断有效(即 map = Collections.emptyMap() 有效)
是啊,没错。我编辑了答案,使其更加全面。
J
Jon Skeet

Collections.emptyMap()


问题是这个映射只能应用于 Map 对象而不是 HashMap
您应该(通常)避免声明其特定类型的对象,而是使用接口(或抽象父对象)。尽量避免“HashMap foo;”并使用“Map foo;”反而
A
AndreiM

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

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

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


P
Peter Štibraný

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


V
Vitalii Fedorenko

由于在许多情况下,空映射用于 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();
    }
  }

}

O
OscarRyz

关于什么 :

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


您将无法修改以这种方式创建的空地图。