如何初始化静态Map?

1241

如何在Java中初始化静态Map

方法一:使用静态初始化器
方法二:使用实例化初始化器(匿名子类) 或 其他方法?

每种方法的优缺点是什么?

以下是两种方法的示例:

import java.util.HashMap;
import java.util.Map;

public class Test {
    private static final Map<Integer, String> myMap = new HashMap<>();
    static {
        myMap.put(1, "one");
        myMap.put(2, "two");
    }

    private static final Map<Integer, String> myMap2 = new HashMap<>(){
        {
            put(1, "one");
            put(2, "two");
        }
    };
}

2
在Java 8中初始化一个Map:https://dev59.com/questions/1nRB5IYBdhLWcg3wyqOo#37384773 - akhil_mittal
2
请不要使用双括号初始化(double brace initialization) - 这是一种hack方法,容易导致内存泄漏和其他问题。 - dimo414
Java 9?如果输入数量<=10,请使用Map.of,否则请使用Map.ofEntries,请参见https://dev59.com/1nRB5IYBdhLWcg3wyqOo#37384773。 - akhil_mittal
43个回答

0

我做了一些不太一样的东西。虽然不是最好的,但对我来说很有效。也许它可以“泛化”。

private static final Object[][] ENTRIES =
{
  {new Integer(1), "one"},
  {new Integer(2), "two"},
};
private static final Map myMap = newMap(ENTRIES);

private static Map newMap(Object[][] entries)
{
  Map map = new HashMap();

  for (int x = 0; x < entries.length; x++)
  {
    Object[] entry = entries[x];

    map.put(entry[0], entry[1]);
  }

  return map;
}

这种方法的问题在于它根本不是类型安全的(如果你使用Java,你需要类型安全)。你可以将任何类型的对象作为键和值。它只适用于 Map<Object, Object>(虽然可以使用类似的方法来处理 Map<String,String>String[][],以及其他 Map<T,T> 的情况)。它不适用于键类型与值类型不同的映射。 - Paŭlo Ebermann

0
如果您可以在Java 8中使用数据的字符串表示形式,这也是一种选择:
static Map<Integer, String> MAP = Stream.of(
        "1=one",
        "2=two"
).collect(Collectors.toMap(k -> Integer.parseInt(k.split("=")[0]), v -> v.split("=")[1]));

0
在Java 8中,过程式方法也可以包装在Supplier中:
Map<String,String> m = ((Supplier<Map<String,String>>)(() -> {
    Map<String,String> result = new HashMap<>();
    result.put("foo","hoo");
    ...
    return result;
)).get();

这只是一种假设的方式,但如果你真的需要一行代码,它可能会很方便。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接