为什么 java.util.Map 值可以是原始数组而不是单个原始数组

Why java.util.Map value can be primitive array but not single primitive

这里有两个例子

将值映射为单个值

private Map<Short, Boolean> _Booleans = new HashMap<Short, Boolean>(); //works
private Map<Short, boolean> _Booleans = new HashMap<Short, boolean>(); //not allowed

将值映射为数组

private Map<Short, Boolean[]> _Booleans = new HashMap<Short, Boolean[]>(); //works
private Map<Short, boolean[]> _Booleans = new HashMap<Short, boolean[]>(); //works!

原始包装器被强制使用单值,但原始数组是允许的,这是为什么?

子问题:是否可以将单值基元与 Map 一起使用?

地图只能存储 Objects。基元不是 Objects 除非它们在包装器 class 中(在您的示例中是 Boolean 而不是 boolean)。

数组始终是 Objects,无论它们包含何种数据。因此,它们可以毫无问题地存储在 Map 中。

在 Java 中,通常您应该更喜欢使用原始值,因为它们在内存使用方面更快更小。但是,在某些情况下(如您的示例中的情况),盒装类型更有用。在某些情况下(通常在使用泛型时),autoboxing 可能会生效。

基元与其 Object 对应物之间的一个重要区别是 Object 可以为空。原语永远不会为空。

如@Nik 所指,地图仅存储对象(Java 中的任何 class)

现在回答你的问题,为什么可以存储原始布尔值数组 -> 这是因为在 Java(以及许多其他语言)中,数组是一个对象

boolean cc[]={true, false};
System.out.println(cc instanceof Object);//gives true

注意 -> 这是真的,只是因为 cc 中有一个实际的数组,但是如果你把 null 给它 -> 它不再是 Object 的实例所以:

cc=null;
System.out.println(cc instanceof Object);//gives false

注2 -> 对于你的子问题:你不能直接使用它们 考虑这个例子:

HashMap aMap=new HashMap();
        int x=120;//int value of 120
        aMap.put("120",x);//parsed Integer with value of 120
        x=aMap.get("120");//compiler error - Type mismatch

还有一件事,因为你对这个主题很感兴趣。我会向您推荐一本名为 "Effective Java" 的书,作者是 Joshua Bloch,他顺便在 Java 中开发了 Collections,而 Map 当然是一个集合。