long intarrayof initialize from example define declarar create array kotlin

intarrayof - kotlin initialize int array



IntArray vs Array<Int> en Kotlin (3)

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

Sé que IntArray traduce en 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 clases del tipo {primitive}Array cuando casi cualquier cosa puede organizarse en un array, no solo primitivos.


Las matrices en Kotlin son clases (no tipos "especiales" como Java).

El stdlib de Kotlin proporciona clases de propósito especial para matrices JVM primitivas para mejorar la integración y el rendimiento del lenguaje Java.

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

Puede consultar la documentación de Language con respecto a este asunto aquí: https://kotlinlang.org/docs/reference/basic-types.html#arrays


Vale la pena señalar que el uso del operador spread ( * ) en un vararg devolverá un IntArray . Si necesita un Array<Int> , puede convertir su IntArray usando .toTypedArray() .


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

Esto significa que cuando pones un Int en un Array<Int> , siempre estará encuadrado (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.

Aparte de las posibles implicaciones de rendimiento de lo anterior, también es conveniente tener en cuenta. Las matrices primitivas se pueden dejar sin inicializar y tendrán valores predeterminados de 0 en todos los índices. Es por IntArray que IntArray y el resto de los arreglos primitivos 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

En contraste, Array<T> no tiene un constructor que solo tome un parámetro de tamaño: necesita instancias de T no nulas válidas en todos los índices para estar en un estado válido después de la creación. Para los tipos de Number , este podría ser un 0 predeterminado, pero no hay manera de crear instancias predeterminadas de un tipo T arbitrario.

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

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

O cree un Array<Int?> Para evitar tener que inicializar cada valor, pero luego se verá obligado a lidiar con los posibles valores null cada vez que lea desde el arreglo.

val arr = arrayOfNulls<Int>(10)