Erstellen Sie eine Liste der primitiven int?

94

Gibt es eine Möglichkeit, eine Liste von primitiven int oder Primitiven in Java wie folgt zu erstellen?

List<int> myList = new ArrayList<int>();

Es scheint, ich kann es tun List myList = new ArrayList();

und fügen Sie "int" in diese Liste ein. Aber dann würde das bedeuten, dass ich alles in diese Liste aufnehmen kann.

Ist meine einzige Option, ein Array von int zu erstellen und es in eine Liste zu konvertieren oder eine Liste von Integer-Objekten zu erstellen?

Susie
quelle
Wenn Leistung Ihr Anliegen ist, sollte Trove helfen.
Assylias
Es ist möglich, eine Liste mit einem Basis-Array zu erstellen, aber Sie müssen zunächst die Größe des Arrays kennen, und Sie verlieren viele andere Funktionen, die mit dem Collections-Objekt geliefert werden. Sie können jedoch Folgendes tun: int [] array = new int [10];
Taylor

Antworten:

141

In Java ist der Typ einer Variablen entweder ein primitiver Typ oder ein Referenztyp. Generische Typargumente müssen Referenztypen sein. Da Grundelemente nicht erweitert werden Object, können sie nicht als generische Typargumente für einen parametrisierten Typ verwendet werden.

Verwenden Sie stattdessen die IntegerKlasse, die ein Wrapper ist für int:

List<Integer> list = new ArrayList<Integer>();

Wenn Sie Java 7 verwenden, können Sie diese Deklaration mit dem Diamantoperator vereinfachen:

List<Integer> list = new ArrayList<>();

Mit Autoboxing in Java wird der primitive Typ bei Bedarf intzu einem Integer.

Autoboxing ist die automatische Konvertierung, die der Java-Compiler zwischen den primitiven Typen und den entsprechenden Objekt-Wrapper-Klassen vornimmt.

Folgendes gilt also:

int myInt = 1;
List<Integer> list = new ArrayList<Integer>();
list.add(myInt);

System.out.println(list.get(0)); //prints 1
Kevin Bowersox
quelle
Die JTable-Methode setSelectedIndices ist also unsinnig: docs.oracle.com/javase/8/docs/api/javax/swing/…
vdolez
25

Nein, es gibt keine Sammlung, die primitive Typen enthalten kann, wenn Java Collection Framework verwendet wird.

Es gibt jedoch auch andere Java-Sammlungen, die primitive Typen unterstützen, z. B .: Trove , Colt , Fastutil , Guava

Ein Beispiel dafür, wie eine Arrayliste mit Ints bei Verwendung der Trove Library aussehen würde, ist das Folgende:

 TIntArrayList list= new TIntArrayList();

Die Leistung dieser Liste ist im Vergleich zur ArrayList of Integers aus Java Collections viel besser, da das Autoboxing / Unboxing für die entsprechende Integer Wrapper-Klasse nicht erforderlich ist.

Mike B.
quelle
1
Ich konnte keine primitive Sammlungsimplementierung in Guava finden. Können Sie bitte einen Link angeben?
Nimcap
9

Gibt es eine Möglichkeit, eine Liste von primitiven int oder Primitiven in Java zu erstellen?

Nein, kannst du nicht. Sie können nur Liste der Referenztypen erstellen, wie Integer, Stringoder Ihre benutzerdefinierten Typ.

Es scheint, dass ich List myList = new ArrayList();"int" in diese Liste aufnehmen kann.

Wenn Sie intdieser Liste hinzufügen , wird sie automatisch dem IntegerWrapper-Typ zugeordnet. Aber es ist eine schlechte Idee zu verwenden rohe Typ - Listen oder für jede generische Art für diese Angelegenheit, in neuerem Code.

Ich kann alles in diese Liste aufnehmen.

Dies ist natürlich der Nachteil der Verwendung von Rohtyp. Sie können Katze , Hund , Tiger , Dinosaurier in einem Behälter haben.

Ist meine einzige Option, ein Array von int zu erstellen und es in eine Liste zu konvertieren

Auch in diesem Fall erhalten Sie List<Integer>nur eine. Es gibt keine Möglichkeit, List<int>Primitive zu erstellen .

Sie sollten sowieso nicht gestört werden. Auch in List<Integer>können Sie einen intprimitiven Typ hinzufügen . Es wird automatisch verpackt, wie im folgenden Beispiel:

List<Integer> list = new ArrayList<Integer>();
list.add(5);
Rohit Jain
quelle
Gute Diskussion über den Rohtyp.
Kevin Bowersox
Um klar zu sein, können Sie eine Liste mit primitiven Typen erstellen, indem Sie einfach ein Basisarray verwenden. int [] array = new int [10];
Taylor
1
@ Taylor Aber das wird nicht dynamisch Liste erhöhen. Das ist ein Array. Und ich gehe davon aus, dass OP das bereits wissen würde.
Rohit Jain
5

Das ist nicht möglich. Die Java-Spezifikation verbietet die Verwendung von Grundelementen in Generika. Sie können jedoch dank des Boxens erstellen ArrayList<Integer>und aufrufen, add(i)ob ies sich um ein Int handelt.

Nanofarad
quelle
4

Sie können primitive Sammlungen verwenden, die in Eclipse- Sammlungen verfügbar sind . Eclipse - Kollektionen haben List, Set, Bagund Mapfür alle Primitiven. Die Elemente in den primitiven Sammlungen werden als primitive Elemente beibehalten, und es findet kein Boxen statt.

Sie können eine IntList wie folgt initialisieren :

MutableIntList ints = IntLists.mutable.empty();

Sie können von a List<Integer>in IntListwie folgt konvertieren :

List<Integer> integers = new ArrayList<>();
MutableIntList ints = ListAdapter.adapt(integers).collectInt(each -> each);

Hinweis: Ich bin ein Mitarbeiter von Eclipse Collections.

Nikhil Nanivadekar
quelle
2

Sammlungen verwenden Generika, die entweder Referenztypen oder Wilcards unterstützen. Sie können jedoch einen IntegerWrapper verwenden

List<Integer> list = new ArrayList<>();
Reimeus
quelle
0

Wenn Sie Java für die Android-Entwicklung verwenden, wird empfohlen, diese zu verwenden SparseIntArray, um Autoboxen zwischen intund zu verhindern Integer.

Weitere Informationen finden Sie SparseIntArrayin der Dokumentation der Android-Entwickler. Eine gute Erklärung für das Autoboxen unter Android finden Sie hier

Stefan Medack
quelle
Das ist eine starke Aussage. Sicher SparseIntArrayist häufig eine bessere Option, aber es gibt Kompromisse zu beachten. "Die Implementierung ist nicht für Datenstrukturen geeignet, die eine große Anzahl von Elementen enthalten können. Sie ist im Allgemeinen langsamer als eine herkömmliche HashMap ..."
Andy Thomas
Ja das stimmt. Sie decken diesen Kompromiss in dem von mir verlinkten Video ziemlich gut ab. Aber das OP fragte nach dieser speziellen Möglichkeit und ich wollte nur hinzufügen, dass es tatsächlich mit Android möglich ist und auch für die meisten Anwendungsfälle empfohlen wird. Vielen Dank für das Hinzufügen dieser Informationen!
Stefan Medack
0

Gibt es eine Möglichkeit, ein Integer [] -Array in ein int [] -Array zu konvertieren?

Diese grobe Auslassung aus den Java-Kernbibliotheken scheint bei so ziemlich jedem Projekt aufzutreten, an dem ich jemals gearbeitet habe. Und so praktisch die Trove-Bibliothek auch sein mag, ich kann die genauen Anforderungen für die Erfüllung von LPGL für eine Android-App, die eine LGPL-Bibliothek statisch verknüpft, nicht analysieren (Präambel sagt ok, body scheint nicht dasselbe zu sagen). Und es ist einfach unpraktisch, Apache-Quellen zu entfernen, um diese Klassen zu erhalten. Es muss einen besseren Weg geben.

Robin Davies
quelle
-4

Die Java-Sammlung sollte nur eine Sammlung von Objekten sein.

List<Integer> integerList = new ArrayList<Integer>();

Ganzzahl ist die Wrapper-Klasse des primitiven Datentyps int.

mehr von JAVA Wrapper Klassen hier !

Sie können direkt speichern und int zu / von integerList erhalten als, integerList.add(intValue); int intValue = integerList.get(i)

Selvaraj
quelle
1
Die erste Zeile wird nicht kompiliert und die letzten beiden Codezeilen sind überall. Bitte unterlassen Sie dies.
The_Martian