当前位置: 首页 > 面试题库 >

用Map.ofEntries()代替Map.of()有什么用

章昱
2023-03-14
问题内容

从Map.java的文档中-

Map.of()Map.ofEntries()静态工厂方法提供了一种方便的方法来创建不可改变的地图。

但是当我已经可以使用重载方法时 …

Map.of("k1","v1","k2","v2","k3","v3"...);

… Map.ofEntries的用途是什么

返回一个不变的映射,其中包含从给定条目提取的键和值,并且条目本身未存储在映射中。


问题答案:

__

关于如何创建包含26个元素的Map的任何猜测?

您已链接的Map中的两个工厂方法之间的主要区别是:

Map.ofEntries

返回一个不变的映射,其中包含从给定 条目中 提取的键和值(不受计数限制)

JEP-269:便利工厂收集方法

对于大量条目,将提供一个API,该API将在给定 任意数量的键值对的 情况下创建Map实例:

Map.ofEntries(Map.Entry<K,V>...)

尽管此方法类似于List和Set的等效varargs
API,但不幸的是,它要求将每个键值对都装箱。适用于静态导入的将键和值装箱的方法将使此操作更加方便:

Map.Entry<K,V> entry(K k, V v)

您对.of()Map中的方法的假设有些不正确,可能是因为它可以用Java9编译:

List<Integer> values = List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // note 11 elements here

Set<String> keys = Set.of("z", "o", "tw", "th", "fo", "fi", "si", "se", "e", "n", "te");

另一方面,这不会:

Map<String, Integer> map = Map.of("z", 0, "o", 1,
      "tw", 2, "th", 3, "fo", 4, "fi", 5,
      "si", 6, "se", 7, "e", 8, "n", 9, "te", 10); // this would not compile

这样做的原因是因为有一个varargs实现
List.of

Set.of
但是要为Map键和值创建一个类似的API,也应该按照JEP中的说明进行装箱。因此,使用类型
Map.entry() 为varargs的相同对象创建为:

Map<String, Integer> map = Map.ofEntries(Map.entry("z",0),
       Map.entry("o",1),Map.entry("t",2)...so on);

此外, 自9以来 ,其文档Map.entry()也有所介绍- __

返回一个Map.Entry包含给定键和值的不可变值。这些条目适用于使用Map.ofEntries()方法填充Map实例 。

Entry通过此方法创建的实例具有以下特征:

  • 它们不允许空键和值。尝试使用空键或空值创建它们会导致NullPointerException。

  • 它们是不可变的。在UnsupportedOperationException中返回的Entry结果上对Entry.setValue()的调用。

  • 它们不可序列化。

* 它们是基于价值的。调用者不应对返回实例的身份做任何假设。此方法可以自由创建新实例或重用现有实例。因此,在这些实例上的身份敏感操作(引用相等(==),身份哈希码和同步)不可靠,应避免。

与最近介绍的
不可变地图静态工厂方法
的特征相似。



 类似资料:
  • 问题内容: 所以我查看了一些Java代码并偶然发现: 基本上,此列表接受所有属于SomeObject的对象- SomeObject本身或其继承者。但是根据多态性,它的继承者也可以看作是SomeObject,因此它也可以工作: 那么,为什么在第二个选项定义明确且基本相同时,有人会使用第一个选项呢? 问题答案: 在这种情况下,您不能说( 不允许 )在哪里 你可以说 ( 允许 ) 但是请注意,您 不能在

  • 问题内容: 我刚刚发现它已被弃用,这使我在Google上可以找到的有关如何使用客户端的所有信息失效。在Javadoc中没有给出指示,以什么来代替使用。Google同样保持沉默。 我现在已经回复,但是无论如何都会对答案感兴趣,以及人们应该如何找到答案而又不问其他知道的人?我是否可以找到该信息的资源? 问题答案: 3.0测试文档这里介绍,像这样这些弃用: Resteasy手动客户端API,拦截器,St

  • 问题内容: 我正在尝试对由路由器插座放置的元素进行倾斜设置,以确保生成的元素的宽度为100% 从大多数答复中,我看到我应该使用选择器,但是从Angular的文档中,它已被弃用。有替代品吗? 问题答案: FWIW在我的研究中,我没有找到ng- deep的替代品或其他适用的替代品。我相信这是因为,Angular团队正在遵循影子dom的W3C规范,该规范最初具有诸如的选择器。但是,W3c自此删除了该建议

  • 在我以前的网站上,我曾经使用cookie来显示一个预主页,只有在第一次访问时。这很有效(例如,请参见此处),但是现在使用cookie并不流行,所以我想尽量避免使用cookie。 现在,我的新网站项目几乎总是通过javascript启动pre-home(显示一个modalbox),所以我不需要在服务器端执行任何操作。我正在考虑使用HTML5的localStorage而不是Cookie,如果浏览器没有

  • 问题内容: 在PHP页面上的表单中,可以使用: 要么 要么 在表单的动作属性中。由于echo 不会传递要使用的变量,而您必须使用,为什么还要使用它呢? 我问是因为我花了一些时间才弄清楚这些变量没有随传递。谢谢。 问题答案: 该属性将默认为当前URL。这是“将表格提交到它来自的地方的最可靠,最简单的方法”。 没有理由使用,并且根本不提交表单(除非附加了事件处理程序来处理提交)。

  • GitHub copilot原来是用学生认证,现在突然失效了,jetbrains 搞了个AI Assistant,但是一直 在waitlist,问下还有什么好的替代