在Java中初始化Hashtables?

Jim*_*_CS 12 java

在C#中,您可以使用以下代码初始化Hashtables(以及许多其他类型的对象) -

Hashtable table = new Hashtable {{1, 1}, {2, 2}};
Run Code Online (Sandbox Code Playgroud)

在Java中是否存在类似的内容,或者您​​是否必须先声明Hashtable然后手动将项目逐个放入其中?

alp*_*ian 32

这可以在别处解答,但您可以使用匿名子类:

new HashMap<Integer, Integer>() {{ put(1, 1); put(2, 2); }};
Run Code Online (Sandbox Code Playgroud)

很多锅炉板,但仍然是单线:).不幸的是,这也会抱怨缺少serialVersionUID常量,你可以添加或忽略警告.

这称为实例初始化块,此处提供了更多信息.

  • 但是,这里存在潜在的内存泄漏.因为您正在创建一个匿名类,所以它将引用其封闭类(即出现此代码的类).这意味着,只要这个"地图"仍然存在,封闭的类也是如此.如果封闭类的生命周期比`Map`短(例如,`Map`是长寿的,而封闭类是负责创建`Map`的一些构建器),那么你就有内存泄漏. (8认同)
  • 是的,其中一个"聪明但不推荐"的想法.DBI认为有害;-) (2认同)

Kev*_*ker 8

Google Guava中,如果您想要一个不可变的地图,您可以使用:

Map<K,V> m = ImmutableMap.of(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5);
Run Code Online (Sandbox Code Playgroud)

最多5个键/值对.

除此之外,您可以使用他们的ImmutableMap.Builder类:

ImmutableMap<String, Integer> WORD_TO_INT = ImmutableMap.builder()
       .put("one", 1)
       .put("two", 2)
       .put("three", 3)
       .build();
Run Code Online (Sandbox Code Playgroud)

仍然不如C#好,但流畅的API有点帮助.