首页 > Java > 有没有办法像这样初始化Java HashMap?

有没有办法像这样初始化Java HashMap?

上一篇 下一篇

有没有办法像这样初始化Java HashMap?

Map<String,String> test = 
    new HashMap<String, String>{"test":"test","test":"test"};

正确的语法是什么?我没有找到任何关于这个的东西。这可能吗?我正在寻找最短/最快的方法来将一些“最终/静态”值放入地图中,这些值永远不会改变,并且在创建地图时会提前知道。

分割线

网友回答:

这是一种方式。

Map<String, String> h = new HashMap<String, String>() {{
    put("a","b");
}};

但是,您应该小心并确保您理解上述代码(它创建了一个继承自 HashMap 的新类)。因此,您应该在此处阅读更多内容: http://www.c2.com/cgi/wiki?DoubleBraceInitialization
,或者干脆使用 Guava:

Map<String, Integer> left = ImmutableMap.of("a", 1, "b", 2, "c", 3);

ImmutableMap.of最多适用于 5 个条目。否则,请使用构建器:源。

分割线

网友回答:

所有版本

如果您碰巧只需要一个条目:有 .Collections.singletonMap("key", "value")

对于 Java 版本 9 或更高版本:

是的,这现在可以了。在Java 9中,添加了几个工厂方法来简化映射的创建:

// this works for up to 10 elements:
Map<String, String> test1 = Map.of(
    "a", "b",
    "c", "d"
);

// this works for any number of elements:
import static java.util.Map.entry;    
Map<String, String> test2 = Map.ofEntries(
    entry("a", "b"),
    entry("c", "d")
);

在上面的示例中,两者和将是相同的,只是表达地图的方式不同。该方法最多为映射中的十个元素定义,而该方法没有此类限制。testtest2Map.ofMap.ofEntries

请注意,在这种情况下,生成的映射将是不可变的映射。如果您希望地图是可变的,您可以再次复制它,例如使用 .另请注意,在这种情况下,键和值不得为 。mutableMap = new HashMap<>(Map.of("a", "b"));null

(另见JEP 269和Javadoc)

对于最高 Java 版本 8:

不,您必须手动添加所有元素。您可以在匿名子类中使用初始值设定项来缩短语法:

Map<String, String> myMap = new HashMap<String, String>() {{
    put("a", "b");
    put("c", "d");
}};

但是,在某些情况下,匿名子类可能会引入不需要的行为。这包括例如:

  • 它生成一个额外的类,该类会增加内存消耗、磁盘空间消耗和启动时间
  • 如果是非静态方法:它包含对调用创建方法的对象的引用。这意味着在仍然引用创建的 map 对象时,不能对外部类的对象进行垃圾回收,从而阻塞额外的内存

使用函数进行初始化还可以让您在初始值设定项中生成映射,但避免令人讨厌的副作用:

Map<String, String> myMap = createMap();

private static Map<String, String> createMap() {
    Map<String,String> myMap = new HashMap<String,String>();
    myMap.put("a", "b");
    myMap.put("c", "d");
    return myMap;
}

分割线

网友回答:

如果您允许第三方库,则可以使用 Guava 的不可变映射来实现类似文字的简洁性:

Map<String, String> test = ImmutableMap.of("k1", "v1", "k2", "v2");

这适用于最多 5 个键/值对,否则您可以使用其生成器:

Map<String, String> test = ImmutableMap.<String, String>builder()
    .put("k1", "v1")
    .put("k2", "v2")
    ...
    .build();

 

  • 请注意,Guava的ImmutableMap实现与Java的HashMap实现不同(最值得注意的是它是不可变的,不允许空键/值)
  • 有关详细信息,请参阅 Guava 的用户指南文章,了解其不可变集合类型

模板简介:该模板名称为【有没有办法像这样初始化Java HashMap?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Java】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 196次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 02-22
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
响应式 微信文章 微信图片 微信素材 自适应 企业网站 单页式简历模板 微信公众平台 微信模板 html5
您可能会喜欢的其他模板