为什么java.util.Map值可以是基本数组而不是单基元

时间:2015-08-12 12:29:18

标签: java dictionary wrapper primitive value-type

以下是两个例子

将值映射为单值

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一起使用?

2 个答案:

答案 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当然是一个集合。