为什么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
为什么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
按照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]
这是一个很棒的答案。谢谢:-) –
这是因为Scala中的所有所谓的基元都从AnyVal继承而来。 AnyVal是在构造函数中有一个字段的类(还有一些其他的东西[在这里](http://docs.scala-lang.org/overviews/core/value-classes.html))。所以任何从AnyVal继承的东西,除非你使用声明类中的方法,在运行时是原始的。当你使用声明的方法时,它的实例被使用。这是为了消除使用instnaces的开销。 – bkowalikpl
顺便说一句'new Array [T](len)'是在scala中使用数组的一种劝阻方式。 (可能是因为这可能会导致各种混乱,就像你在这个问题中所表明的那样)。 –