C# 到 Java - 字典?

2022-08-31 20:32:06

在Java中,是否可以使用其中已经声明的项目制作字典?就像下面的 C# 代码:

   Dictionary<string, int> d = new Dictionary<string, int>()
    {
        {"cat", 2},
        {"dog", 1},
        {"llama", 0},
        {"iguana", -1}
    };

我该怎么做,我使用什么类型?我读过字典已经过时了。


答案 1

这将执行您想要的操作:

Map<String,Integer> map = new HashMap<String, Integer>(){{
    put("cat", 2);
    put("dog", 1);
    put("llama", 0);
    put("iguana", -1);
}};

此语句创建 HashMap 的匿名子类,其中与父类的唯一区别是在实例创建期间添加 4 个条目。这是Java世界中一个相当常见的习语(尽管有些人认为它有争议,因为它创建了一个新的类定义)。

由于这种争议,从Java 9开始,有一个方便构建映射的新习语:静态Map.of方法家族。

使用 Java 9 或更高版本,您可以按如下方式创建所需的映射:

Map<String, Integer> map = Map.of(
    "cat", 2,
    "dog", 1,
    "llama", 0,
    "iguana", -1
);

对于较大的映射,此替代语法可能不太容易出错:

Map<String, Integer> map = Map.ofEntries(
    Map.entry("cat", 2),
    Map.entry("dog", 1),
    Map.entry("llama", 0),
    Map.entry("iguana", -1)
);

(如果Map.entry是静态导入而不是显式引用的,这尤其好)。

除了仅使用Java 9 +之外,这些新方法与以前的方法并不完全等效:

  • 它们不允许您指定使用的 Map 实现
  • 它们只创建不可变的映射
  • 它们不会创建 Map 的匿名子类

但是,这些差异对于许多用例来说并不重要,这使得这对于较新版本的Java来说是一个很好的默认方法。


答案 2
Map<String,Integer> map = new HashMap<String, Integer>(){{
put("cat", 2);
put("dog", 1);
put("llama", 0);
put("iguana", -1);
}};