IntArray vs Array <Int> en Kotlin

No estoy seguro de cuál es la diferencia entre un IntArray y un Array<Int> en Kotlin y por qué no puedo usarlos de forma intercambiable:

missmatch

Sé que IntArray traduce a int[] cuando se dirige a la JVM , pero ¿a qué se traduce Array<Int> ?

Además, también puede tener String[] o YourObject[] . Por qué Kotlin tiene classs del tipo {primitive}Array cuando casi todo se puede organizar en una matriz, no solo primitivas.

Array<Int> es un Integer[] bajo el capó, mientras que IntArray es un int[] . Eso es.

Esto significa que cuando coloca un Int en un Array<Int> , siempre estará en recuadro (específicamente, con una llamada Integer.valueOf() ). En el caso de IntArray , no se producirá ningún boxeo, ya que se traduce en una matriz primitiva de Java.


Además de las posibles implicaciones de performance de lo anterior, también hay conveniencia para considerar. Las matrices primitivas pueden dejarse sin inicializar y tendrán valores 0 pnetworkingeterminados en todos los índices. Esta es la razón IntArray cual IntArray y el rest de las matrices primitivas tienen constructores que solo toman un parámetro de tamaño:

 val arr = IntArray(10) println(arr.joinToString()) // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 

Por el contrario, Array<T> no tiene un constructor que solo tome un parámetro de tamaño: necesita instancias T válidas y no nulas en todos los índices para estar en un estado válido después de la creación. Para los types de Number , este podría ser un 0 pnetworkingeterminado, pero no hay forma de crear instancias pnetworkingeterminadas de un tipo arbitrario T

Por lo tanto, al crear un Array<Int> , puede usar el constructor que también toma una function de initialization:

 val arr = Array<Int>(10) { index -> 0 } // full, verbose syntax val arr = Array(10) { 0 } // concise version 

O cree un Ąrray<Int?> Para evitar tener que inicializar cada valor, pero luego se verá forzado a tratar con posibles valores null cada vez que lea de la matriz.

 val arr = arrayOfNulls<Int>(10) 

Las matrices en Kotlin son classs (no types "especiales" como Java).

Kotlin's stdlib proporciona classs de propósito especial para matrices primitivas JVM con el fin de mejorar la integración y el performance del lenguaje Java.

La regla de oro sería usar Array<T> excepto si causa un problema al mezclar con el código de Java existente, o debería llamarse desde las classs de Java. Para el logging, nunca tuve que usar IntArray .

Puede consultar la documentation del Idioma con respecto a este asunto aquí: https://kotlinlang.org/docs/reference/basic-types.html#arrays

  • Java permite acceder a la variable base de Kotlin a través de su hijo, pero no a Kotlin, ¿por qué?
  • kodein, inyecta datos a la class simple
  • Se deben declarar las funciones locales de Kotlin antes del uso
  • esta reference en un inicializador perezoso de la propiedad de extensión kotlin
  • ¿Hay alguna forma de reutilizar una instancia de Job?
  • Kotlin valor negativo negativo de retorno de modul
  • Objeto de inheritance rápida y significado de la interfaz
  • Markdown # vs multiple #
  • Enlace de datos de atributo personalizado Kotlin
  • ¿No se necesita NotNull en Kotlin?
  • Mantenga BaseActivity en Java compatible con la actividad de Kotlin