2014-06-15 46 views
4

为什么Int类型的数组将其初始化为0,但是BigInt类型的数组的初始化为null?初始化Array [BigInt] vs Scala中的Array [Int]

val a = new Array[Int](1) 
val b = new Array[BigInt](1) 
println(a.mkString()) 
println(b.mkString()) 

产生

0 
null 
+0

顺便说一句'new Array [T](len)'是在scala中使用数组的一种劝阻方式。 (可能是因为这可能会导致各种混乱,就像你在这个问题中所表明的那样)。 –

回答

5

按照scaladoc为Int

Int的实例不是由在底层运行时系统中的对象来表示。

看看编译后的类文件,它确实显示Int的数组成为字节码中的int原语数组。默认情况下,int基元的值为0。

0 iconst_1 
1 newarray int [10] 
3 astore_2 [a] 
4 iconst_1 
5 anewarray scala.math.BigInt [16] 
+0

这是一个很棒的答案。谢谢:-) –

+1

这是因为Scala中的所有所谓的基元都从AnyVal继承而来。 AnyVal是在构造函数中有一个字段的类(还有一些其他的东西[在这里](http://docs.scala-lang.org/overviews/core/value-classes.html))。所以任何从AnyVal继承的东西,除非你使用声明类中的方法,在运行时是原始的。当你使用声明的方法时,它的实例被使用。这是为了消除使用instnaces的开销。 – bkowalikpl