为什么打印IntArray会显示地址而不是数组的值?

时间:2018-10-08 23:30:57

标签: kotlin

当我尝试打印出任何原始类型的数组(例如下面的数组)时,为什么返回一个地址而不是数组中的实际值,我有些困惑。

fun notInPlaceRevers(array : IntArray): IntArray{
  val arrayB = IntArray(5)

  for (i in 0 until array.size)
      array[i] =  array[(array.size -1)  - i]

  return arrayB
}



fun main(args: Array<String>) {
  val initialArray = intArrayOf(2,3,4,5,6)

  print("${notInPlaceRevers(initialArray)}")
}

它打印出-> [I @ 3834d63f

现在我已经进行了测试,当我进行诸如forp的循环时,它会打印出每个索引中的值

for(element in initialArray)
  print("$element")

这与kotlin类似于java的方式有关,当将对象传递给函数时,kotlin传递对象引用的副本。因此,在打印基本数组时,我会得到引用吗?

还有另一种更简单的方法来打印基本数组吗?

4 个答案:

答案 0 :(得分:2)

  

这与kotlin类似于java的方式有关,当将对象传递给函数时,kotlin传递对象引用的副本。因此,当打印原始数组时,我会得到引用吗?

它与JVM平台有关,但与您描述的方式无关。

Kotlin将数组实现为Java数组。数组是一个对象,因此具有toString()方法。您将看到toString类中存在的Object默认实现的输出:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

[I是特殊int[]类的名称,@之后的内容只是十六进制表示形式hashCode()的返回值。巧合的是,它是从最初分配此对象的地址派生的。对象的地址可能会随着每个GC周期的变化而变化,但是其hashCode()永远不会变化,因为那样会损坏。

  

还有另一种更简单的方法来打印基本数组吗?

是的。 Kotlin定义了扩展功能contentToString

val array = arrayOf("apples", "oranges", "lime")
println(array.contentToString()) // [apples, oranges, lime]

答案 1 :(得分:1)

  

它打印出-> [I @ 3834d63f

它与Kotlin没有关系。这就是Java的工作方式。

  

这与kotlin类似于java的方式有关,当将对象传递给函数时,kotlin传递对象引用的副本。因此,当打印原始数组时,我会得到引用吗?

我假设您没有运行Kotlin本机或Kotlin JS。它被编译为Java字节码并在JVM上运行。因此它遵循Java的规则。

  

还有另一种更简单的方法来打印基本数组吗?   参见Mon Vrai Nom's answer

但是,我建议您改用List。直接使用数组几乎没有真正的好处,就像在Java中使用ArrayList一样。不仅您在List上拥有固定的大小,而且还拥有更多的扩展方法。

这里是一个例子。

fun notInPlaceRevers(list : List<Int>): List<Int> {
    return list.mapIndexed { i , _ -> list.size - 1 - i }
}

fun main(args: Array<String>) {
    val initialList = listOf(2, 3, 4, 5, 6)
    print("${notInPlaceRevers(initialList)}")
}

它打印

[4, 3, 2, 1, 0]

答案 2 :(得分:0)

import java.util.Arrays

fun main(args: Array<String>) {
    val array = intArrayOf(1, 2, 3, 4, 5)

    println(Arrays.toString(array))
}

在浏览时发现了这个

答案 3 :(得分:0)

这也可以。只需将它们转换为列表即可。

print(notInPlaceRevers(initialArray).toList())