当我尝试打印出任何原始类型的数组(例如下面的数组)时,为什么返回一个地址而不是数组中的实际值,我有些困惑。
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传递对象引用的副本。因此,在打印基本数组时,我会得到引用吗?
还有另一种更简单的方法来打印基本数组吗?
答案 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())