我可以用文字声明并初始化 java 中的映射吗?

elo*_*esp 4 java dictionary initialization

是否可以声明并初始化Hashtableor Map,这样我们就不必在两个不同的步骤中声明和初始化?

// declare first
Hashtable<String, Integer> numbers = new Hashtable<String, Integer>(3);

// then initialize
numbers.put("one", 1);
numbers.put("two", 2);
numbers.put("three", 3);
Run Code Online (Sandbox Code Playgroud)

例如,在 ruby​​ 和 javascript 中,有文字来定义它们:

numbers = {
  one: 1,
  two: 2,
  three: 3,
}
Run Code Online (Sandbox Code Playgroud)

Rog*_*gue 7

对于 Java 9 及更高版本,您可以使用Map#of, 以及Map#ofEntrieswith Map#entry

Map<String, String> example = Map.ofEntries(
    Map.entry("1", "one"),
    Map.entry("2", "two"),
    Map.entry("3", "three"),
    //...
);
Run Code Online (Sandbox Code Playgroud)

对于较短的文字(10 个或更少的条目),您可以Map#of直接使用(尽管 的语法有点令人困惑Key1, Value1, Key2, Value2, ...):

Map<String, String> example = Map.of("1", "one", "2", "two");
Run Code Online (Sandbox Code Playgroud)

在 Java 9 之前,通常只需要初始化常量Map对象,为此static初始化块也很有用:

private static final Map<String, String> MY_CONSTANT;

static {
    Map<String, String> setup = new HashMap<>();
    setup.put("1", "one");
    setup.put("2", "two");
    setup.put("3", "three");
    MY_CONSTANT = Collections.unmodifiableMap(setup);
}
Run Code Online (Sandbox Code Playgroud)

这将允许您创建一个常量Map,同时允许您在设置之前修改地图。

正如@Pshemo所指出的,有很多理由避免双括号初始化,但是“规则”的显着例外通常是在常量中,与上面的示例非常相似(因为不会创建许多匿名类)。然而,即使在这种情况下,仍然可以解决双括号初始化的需要,因此如果可能的话,总体上最好避免。我认为这是不可能的唯一情况是在类中的常量上下文中enum,双括号 init 可能确实是实现此目的的唯一正确方法。