如何初始化静态地图?

新手上路,请多包涵

您将如何在 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");
        }
    };
}

原文由 dogbane 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 669
2 个回答

在这种情况下,实例初始化器只是语法糖,对吧?我不明白为什么你需要一个额外的匿名类来初始化。如果正在创建的类是最终的,它将不起作用。

您也可以使用静态初始化器创建不可变映射:

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

原文由 Miserable Variable 发布,翻译遵循 CC BY-SA 4.0 许可协议

我喜欢 Guava 初始化静态、不可变地图的方式:

 static final Map<Integer, String> MY_MAP = ImmutableMap.of(
    1, "one",
    2, "two"
);

如您所见,它非常简洁(因为 ImmutableMap 中方便的工厂方法)。

如果您希望地图有超过 5 个条目,则不能再使用 ImmutableMap.of() 。相反,尝试 ImmutableMap.builder() 沿着这些线:

 static final Map<Integer, String> MY_MAP = ImmutableMap.<Integer, String>builder()
    .put(1, "one")
    .put(2, "two")
    // ...
    .put(15, "fifteen")
    .build();

要了解有关 Guava 不可变集合实用程序优势的更多信息,请参阅 Guava 用户指南中 解释 的不可变集合。

(的一个子集)Guava 曾经被称为 Google Collections 。如果您还没有在您的 Java 项目中使用这个库,我 强烈 建议您尝试一下!正如 其他 SO 用户一致认为的 那样,Guava 已迅速成为最流行和最有用的 Java 免费第 3 方库之一。 (如果您是新手,该链接后面有一些优秀的学习资源。)


更新(2015 年) :至于 Java 8 ,我仍然会使用 Guava 方法,因为它比其他任何方法都干净。如果您不想依赖 Guava,请考虑使用 普通的旧 init 方法。如果你问我,使用 二维数组和 Stream API 的 hack 是非常丑陋的,如果你需要创建一个键和值不是同一类型的 Map(比如 Map<Integer, String> 在问题中) .

至于 Guava 的总体未来,关于 Java 8,Louis Wasserman 早在 2014 年就 说过,[ 更新]在 2016 年宣布 Guava 21 将需要并正确支持 Java 8


更新(2016 年) :正如 Tagir Valeev 指出的那样Java 9 最终将通过为集合添加 便利的工厂方法,只使用纯 JDK 来完成这项工作:

 static final Map<Integer, String> MY_MAP = Map.of(
    1, "one",
    2, "two"
);

原文由 Jonik 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题