从Map.java的文档-
在Map.of()
和Map.ofEntries()
静态工厂方法提供了一种方便的方法来创建不可改变的地图.
但是当我已经可以使用重载方法时 ......
Map.of("k1","v1","k2","v2","k3","v3"...);
... Map.ofEntries的用途是什么呢?
返回包含从给定条目中提取的键和值的不可变映射,并且条目本身不存储在映射中.
Naman..
23
有关如何创建26个元素的地图的猜测?
您已经链接的Map中两个工厂方法的主要区别在于:
Map.ofEntries
返回一个不可变映射,其中包含从给定条目中提取的键和值(在计数中不受限制)
来自JEP-269:便利工厂收集方法:
对于大量条目,将提供一个API,该API将在给定任意数量的键值对的情况下创建Map实例:
Map.ofEntries(Map.Entry...)
虽然这种方法类似于List和Set的等效varargs API,但遗憾的是要求每个键值对都是盒装的.用于装箱键和值的方法适用于静态导入,这将使这更方便:
Map.Entry entry(K k, V v)
你对.of()
Map中的方法的假设有些不正确,可能是因为虽然这可以用Java9编译:
List values = List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // note 11 elements here
Set keys = Set.of("z", "o", "tw", "th", "fo", "fi", "si", "se", "e", "n", "te");
另一方面,这不会:
Map 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中的说明进行装箱.所以,使用类型的varargs创建了相同的Map.entry()
:
Map map = Map.ofEntries(Map.entry("z",0),
Map.entry("o",1),Map.entry("t",2)...so on);
此外,Map.entry()
还介绍了以下文件:9 -
返回Map.Entry
包含给定键和值的不可变项.这些条目适合使用该Map.ofEntries()
方法填充Map实例
.
Entry
此方法创建的实例具有以下特征:
它们不允许使用null键和值.尝试使用null键或值创建它们会导致NullPointerException.
他们是不变的.在UnsupportedOperationException中对返回的Entry结果调用Entry.setValue().
它们不可序列化.
它们是基于价值的.调用者不应对返回实例的身份做出任何假设.此方法可以自由创建新实例或重用现有实例.因此,对这些实例的身份敏感操作(引用相等(==),标识哈希代码和同步)是不可靠的,应该避免.
这与最近介绍的不可变地图静态工厂方法的特征相似.
1> Naman..:
有关如何创建26个元素的地图的猜测?
您已经链接的Map中两个工厂方法的主要区别在于:
Map.ofEntries
返回一个不可变映射,其中包含从给定条目中提取的键和值(在计数中不受限制)
来自JEP-269:便利工厂收集方法:
对于大量条目,将提供一个API,该API将在给定任意数量的键值对的情况下创建Map实例:
Map.ofEntries(Map.Entry...)
虽然这种方法类似于List和Set的等效varargs API,但遗憾的是要求每个键值对都是盒装的.用于装箱键和值的方法适用于静态导入,这将使这更方便:
Map.Entry entry(K k, V v)
你对.of()
Map中的方法的假设有些不正确,可能是因为虽然这可以用Java9编译:
List values = List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // note 11 elements here
Set keys = Set.of("z", "o", "tw", "th", "fo", "fi", "si", "se", "e", "n", "te");
另一方面,这不会:
Map 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中的说明进行装箱.所以,使用类型的varargs创建了相同的Map.entry()
:
Map map = Map.ofEntries(Map.entry("z",0),
Map.entry("o",1),Map.entry("t",2)...so on);
此外,Map.entry()
还介绍了以下文件:9 -
返回Map.Entry
包含给定键和值的不可变项.这些条目适合使用该Map.ofEntries()
方法填充Map实例
.
Entry
此方法创建的实例具有以下特征:
它们不允许使用null键和值.尝试使用null键或值创建它们会导致NullPointerException.
他们是不变的.在UnsupportedOperationException中对返回的Entry结果调用Entry.setValue().
它们不可序列化.
它们是基于价值的.调用者不应对返回实例的身份做出任何假设.此方法可以自由创建新实例或重用现有实例.因此,对这些实例的身份敏感操作(引用相等(==),标识哈希代码和同步)是不可靠的,应该避免.
这与最近介绍的不可变地图静态工厂方法的特征相似.
2> manouti..:
好吧,这很简单。Map.of()
不是varargs方法。仅重载Map.of()
最多10个条目。另一方面,Map.ofEntries()
是varargs方法,因此允许您指定所需数量的条目。
他们可能刚刚添加了,Map.ofEntries()
但是由于很多时候您只需要输入几个条目,它们也包含了这些Map.of()
版本作为便捷方法,因此您不需要将每个键值对都包装在内Entry
。
@ user5047085 —键和值可以是不同的类型。在Java中,无法表示一个可变参数,强制奇数元素的类型为`K',偶数元素的类型为`V'。因为所有元素的类型都为Entry
(或更准确地说,Entry <?扩展了K,?扩展了V>),所以允许ofEntry 的子类型。 )。