以下是两个例子
将值映射为单值
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一起使用?
答案 0 :(得分:6)
地图只能存储Objects
。基元不是Objects
,除非它们位于包装类中(在您的示例中为Boolean
而不是boolean
)。
数组总是Objects
,无论它们包含哪种数据。因此,它们可以毫无问题地存储在Map中。
在Java中,通常您应该更喜欢使用原始值,因为它们在内存使用方面更快更小。但是,在某些情况下(如示例中的那种情况),盒装类型更有用。在某些情况下(通常在使用泛型时),autoboxing可能会生效。
基元与Object
对应物之间的一个重要区别是Object
可以为空。原语永远不会为空。
答案 1 :(得分:1)
如@Nik所述,Map只存储对象(Java中的任何类)
现在针对您的问题,为什么可以存储基本布尔数组 - &gt;这是因为在Java(以及许多其他语言)中,Array是一个Object
boolean cc[]={true, false};
System.out.println(cc instanceof Object);//gives true
注意 - &gt;这是真的,只是因为cc中有一个实际的数组,但是如果你把null放到它上面 - &gt;它不再是Object的实例所以:
cc=null;
System.out.println(cc instanceof Object);//gives false
注2 - &gt; 对于子问题:您不能直接使用它们 考虑这个例子:
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当然是一个集合。