Creare un elenco di int primitivo?


94

C'è un modo per creare un elenco di int primitivo o qualsiasi primitiva in java come segue?

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

Sembra di poterlo fare List myList = new ArrayList();

e aggiungi "int" in questo elenco. Ma allora questo significherebbe che posso aggiungere qualsiasi cosa a questo elenco.

La mia unica opzione è creare un array di int e convertirlo in un elenco o creare un elenco di oggetti Integer?


Se le prestazioni sono la tua preoccupazione, Trove dovrebbe aiutarti.
assylias

È possibile creare un elenco utilizzando un array di base, ma devi conoscere la dimensione dell'array per iniziare e perderai molte altre funzionalità fornite con l'oggetto Collections. Ma potresti fare qualcosa come: int [] array = new int [10];
Taylor

Risposte:


141

In Java il tipo di qualsiasi variabile è un tipo primitivo o un tipo di riferimento. Gli argomenti di tipo generico devono essere tipi di riferimento. Poiché le primitive non si estendono, Objectnon possono essere utilizzate come argomenti di tipo generico per un tipo parametrizzato.

Usa invece la Integerclasse che è un wrapper per int:

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

Se stai usando Java 7 puoi semplificare questa dichiarazione usando l'operatore diamante:

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

Con l'autoboxing in Java il tipo primitivo intdiventerà un Integerquando necessario.

L'autoboxing è la conversione automatica che il compilatore Java effettua tra i tipi primitivi e le loro classi wrapper di oggetti corrispondenti.

Quindi vale quanto segue:

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

System.out.println(list.get(0)); //prints 1

Quindi il metodo JTable setSelectedIndices non ha senso: docs.oracle.com/javase/8/docs/api/javax/swing/…
vdolez

25

No, non esiste alcuna raccolta che possa contenere tipi primitivi quando viene utilizzato Java Collection Framework.

Tuttavia, ci sono altre raccolte java che supportano tipi primitivi, come: Trove , Colt , Fastutil , Guava

Un esempio di come sarebbe un elenco di array con int quando viene utilizzata la libreria Trove è il seguente:

 TIntArrayList list= new TIntArrayList();

Le prestazioni di questo elenco, se confrontate con la ArrayList of Integers da Java Collections, sono molto migliori in quanto l'autoboxing / unboxing per la corrispondente Integer Wrapper Class non è necessaria.


1
Non sono riuscito a trovare un'implementazione della raccolta primitiva in Guava. Puoi fornire un link per favore?
nimcap

9

C'è un modo per creare un elenco di int primitivo o qualsiasi primitiva in java

No non puoi. È possibile creare solo Elenco dei tipi di riferimento, come Integer, Stringo il vostro tipo personalizzato.

Sembra che posso fare List myList = new ArrayList();e aggiungere "int" in questo elenco.

Quando si aggiunge inta questo elenco, viene automaticamente boxato al Integertipo di wrapper. Ma è una cattiva idea di utilizzare prime liste di tipo, o per qualsiasi tipo generico è per questo, nel codice più recente.

Posso aggiungere qualsiasi cosa a questo elenco.

Ovviamente, questo è lo svantaggio dell'utilizzo del tipo grezzo. Puoi avere gatto , cane , tigre , dinosauro , tutto in un unico contenitore.

È la mia unica opzione, creare un array di int e convertirlo in un elenco

Anche in questo caso, otterrai un List<Integer>unico file. Non c'è modo di creare List<int>o qualsiasi primitiva.

Non dovresti essere disturbato comunque. Anche in List<Integer>puoi aggiungere inttipi primitivi. Verrà automaticamente inscatolato, come nell'esempio seguente:

List<Integer> list = new ArrayList<Integer>();
list.add(5);

Buona discussione sul tipo grezzo.
Kevin Bowersox

In realtà, per essere chiari, puoi creare un elenco con tipi primitivi semplicemente usando un array di base. int [] array = new int [10];
Taylor

1
@Taylor Ma questo non aumenterà dinamicamente l'elenco. Questo è un array. E presumo che OP ne sarebbe già a conoscenza.
Rohit Jain


5

Non è possibile. La specifica Java proibisce l'uso di primitive nei generici. Tuttavia, puoi creare ArrayList<Integer>e chiamare add(i)if iis an int grazie alla boxe.


4

È possibile utilizzare raccolte primitive disponibili nelle raccolte Eclipse . Eclipse Collezioni ha List, Set, Bage Mapper tutte le primitive. Gli elementi nelle collezioni primitive sono mantenuti come primitivi e non ha luogo alcun pugilato.

Puoi inizializzare un IntList in questo modo:

MutableIntList ints = IntLists.mutable.empty();

Puoi convertire da a List<Integer>in IntListquesto modo:

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

Nota: contribuisco alle collezioni Eclipse.


2

Le raccolte utilizzano generici che supportano i tipi di riferimento o le wilcard. Puoi comunque usare un Integerwrapper

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

0

Quando si utilizza lo sviluppo Java per Android, si consiglia di utilizzare SparseIntArrayper impedire l'autoboxing tra inte Integer.

Puoi trovare ulteriori informazioni su SparseIntArraynella documentazione degli sviluppatori Android e una buona spiegazione per l'autoboxing su Android, inserisci qui la descrizione del link


Questa è una dichiarazione forte. Certamente SparseIntArrayè spesso un'opzione migliore, ma ci sono dei compromessi di cui essere consapevoli. "L'implementazione non è intesa per essere appropriata per strutture dati che possono contenere un gran numero di elementi. È generalmente più lenta di una tradizionale HashMap ..."
Andy Thomas

Sì è vero. Coprono questo compromesso abbastanza bene nel video che ho collegato. Ma l'OP ha chiesto quella particolare possibilità e volevo solo aggiungere che è effettivamente possibile con Android e consigliato anche per la maggior parte dei casi d'uso. Grazie per aver aggiunto queste informazioni!
Stefan Medack

0

Esiste un modo per convertire un array Integer [] in un array int []?

Questa grossolana omissione dalle librerie core Java sembra emergere praticamente in tutti i progetti su cui ho lavorato. E per quanto comoda possa essere la libreria Trove, non sono in grado di analizzare i requisiti precisi per soddisfare LPGL per un'app Android che collega staticamente una libreria LGPL (il preambolo dice ok, il corpo non sembra dire lo stesso). Ed è semplicemente scomodo andare a strappare e rimuovere le fonti Apache per ottenere queste classi. Deve esserci un modo migliore.


-4

La raccolta Java dovrebbe essere costituita solo da raccolte di oggetti.

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

Integer è la classe wrapper del tipo di dati primitivo int.

altro dalle classi wrapper JAVA qui !

Puoi salvare direttamente e ottenere int in / da integerList come, integerList.add(intValue); int intValue = integerList.get(i)


1
La prima riga non verrà compilata e le ultime due righe di codice sono ovunque. Si prega di astenersi dal farlo.
The_Martian
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.