Ich bin mir nicht sicher, was der Unterschied zwischen einem IntArray
und einem Array<Int>
in Kotlin ist und warum ich sie nicht austauschbar verwenden kann:
Ich weiß, dass dies beim Targeting auf IntArray
übersetzt wird , aber was bedeutet das?int[]
JVM
Array<Int>
Sie können auch String[]
oder haben YourObject[]
. Warum Kotlin Klassen dieses Typs hat, {primitive}Array
wenn so ziemlich alles in einem Array angeordnet werden kann, nicht nur Grundelemente.
Array<Int>
kompiliert wirdInteger[]
(wenn der Compiler dies nicht optimiert)Antworten:
Array<Int>
ist einInteger[]
unter der Haube, währendIntArray
ist einint[]
. Das ist es.Dies bedeutet , dass , wenn Sie ein setzen
Int
in einArray<Int>
, wird es immer (genauer gesagt, mit einem boxed wirdInteger.valueOf()
Anruf). Im Fall vonIntArray
tritt kein Boxen auf, da es in ein primitives Java-Array übersetzt wird.Abgesehen von den möglichen Auswirkungen der oben genannten Leistung auf die Leistung ist auch die Bequemlichkeit zu berücksichtigen. Primitive Arrays können nicht initialisiert werden und haben
0
an allen Indizes Standardwerte . Aus diesem Grund habenIntArray
der Rest der primitiven Arrays Konstruktoren, die nur einen Größenparameter annehmen:val arr = IntArray(10) println(arr.joinToString()) // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Im Gegensatz dazu
Array<T>
gibt es keinen Konstruktor, der nur einen Größenparameter akzeptiert: Er benötigt gültige Nicht-Null-T
Instanzen an allen Indizes, um nach der Erstellung in einem gültigen Zustand zu sein. FürNumber
Typen kann dies ein Standard sein0
, es gibt jedoch keine Möglichkeit, Standardinstanzen eines beliebigen Typs zu erstellenT
.Wenn Sie also eine erstellen
Array<Int>
, können Sie entweder den Konstruktor verwenden, der auch eine Initialisierungsfunktion übernimmt:val arr = Array<Int>(10) { index -> 0 } // full, verbose syntax val arr = Array(10) { 0 } // concise version
Oder erstellen Sie eine
Array<Int?>
, um zu vermeiden, dass jeder Wert initialisiert werden muss. Später müssen Sie jedochnull
jedes Mal, wenn Sie aus dem Array lesen, mit möglichen Werten umgehen .val arr = arrayOfNulls<Int>(10)
quelle
int[]
istIntArray
,Integer[]
istArray<Int>
und so weiter, wo ist diese mysteriöse neue Klasse? Es ist dasselbe, nur die Syntax ist unterschiedlich.int[]
ist übrigens auch klasse.Es ist erwähnenswert, dass die Verwendung des
*
Operatorspread ( ) für a einevararg
zurückgibtIntArray
. Wenn Sie eine benötigenArray<Int>
, können Sie IhreIntArray
Verwendung konvertieren.toTypedArray()
.quelle
Arrays in Kotlin sind Klassen (keine "speziellen" Typen wie Java).
Kotlins stdlib bietet spezielle Klassen für primitive JVM-Arrays, um die Integration und Leistung der Java-Sprache zu verbessern.
Als Faustregel gilt die Verwendung, es sei
Array<T>
denn, sie verursacht beim Mischen mit vorhandenem Java-Code ein Problem oder sollte aus Java-Klassen aufgerufen werden. Für die Aufzeichnung musste ich nie verwendenIntArray
.Sie können die diesbezügliche Dokumentation der Sprache hier einsehen : https://kotlinlang.org/docs/reference/basic-types.html#arrays
quelle
Int
,Float
usw., da Kotlin nicht eine andere Art für hatBoolean
oderboolean
. In Bezug auf Arrays würde ich davon ausgehen, dass sichArray<Int>
das von unterscheiden würdeIntArray
. Letzteres habe ich persönlich immer verwendet, da es mich nie gestört hat, aber vielleicht hat Kotlin zusätzliche Optimierungen, die mir nicht bekannt sind. Wenn Sie ausschließlich in Kotlin programmieren, sehe ich keinen Fall, in dem Sie einen über den anderen benötigen , aber das primitive Array kann dennoch seine Vorteile haben.