为什么 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 当然是一个集合。
这里有两个例子
将值映射为单个值
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 当然是一个集合。