Почему при печати IntArray отображается адрес, а не значения массива? - PullRequest
0 голосов
/ 09 октября 2018

Меня немного смущает вопрос, почему, когда я пытаюсь распечатать массив любого примитивного типа, такого как приведенный ниже, он возвращает адрес, а не фактические значения в массиве.

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

Теперь я проверил, и это выводит значение в каждом индексе, когда я делаю цикл foreach, такой как

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

Имеет ли это отношение к тому, как kotlin похож на java, где он передает копию ссылки на объект при передаче объекта в функцию.Таким образом, при печати массива примитивов я получаю ссылку?

Также существует ли еще один более простой способ печати массива примитивов?

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Это распечатывает это -> [I @ 3834d63f

Это не имеет отношения к Kotlin.Вот как работает Java.

Имеет ли это отношение к тому, как kotlin похож на java, где он передает копию ссылки на объект при передаче объекта в функцию.Итак, при печати примитивного массива я получаю ссылку?

Я предполагаю, что вы не используете Kotlin native или Kotlin JS.Он скомпилирован в байт-код Java и работает на JVM.Таким образом, он следует правилам Java.

Также существует ли другой более простой способ печати примитивного массива?См. Mon Vrai Nom's answer

Однако я бы порекомендовал вам использовать List вместо этого.Реальных преимуществ использования массива практически нет, как если бы вы использовали ArrayList в Java.Не только у вас есть фиксированный размер на 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]
0 голосов
/ 09 октября 2018

Имеет ли это отношение к тому, как kotlin похож на java, где он передает копию ссылки на объект при передаче объекта в функцию.Поэтому при печати примитивного массива я получаю ссылку?

Это связано с платформой JVM, но не так, как вы описываете.

Kotlin реализует массивы как массивы Java.Массив является объектом, поэтому он имеет метод toString().То, что вы видите, является выводом реализации по умолчанию toString, представленной в классе Object:

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

[I - это имя специального класса int[] и что следует после @ это просто возвращаемое значение hashCode() в шестнадцатеричном представлении.По совпадению, это происходит от адреса, по которому этот объект был первоначально выделен.Адрес объекта может меняться с каждым циклом GC, но его hashCode() никогда не меняется, потому что он будет поврежден.

Также есть ли еще один более простой способ распечатать примитивный массив?

Да.Котлин определяет функцию расширения contentToString:

val array = arrayOf("apples", "oranges", "lime")
println(array.contentToString()) // [apples, oranges, lime]
0 голосов
/ 09 октября 2018
import java.util.Arrays

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

    println(Arrays.toString(array))
}

Нашел это при просмотре

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...