Criar uma lista de int primitivos?

94

Existe uma maneira de criar uma lista de int primitivos ou quaisquer primitivos em java como a seguir?

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

Parece que posso fazer List myList = new ArrayList();

e adicione "int" a esta lista. Mas isso significaria que posso adicionar qualquer coisa a esta lista.

É minha única opção, criar um array de int e convertê-lo em uma lista ou criar uma lista de objetos Integer?

Susie
fonte
Se o desempenho é a sua preocupação, trove deve ajudar.
assylias 02 de
É possível criar uma lista usando um array básico, mas você tem que saber o tamanho do array para começar, e você perderá muitas outras funcionalidades que vêm com o objeto Collections. Mas você poderia fazer algo como: int [] array = new int [10];
Taylor

Respostas:

141

Em Java, o tipo de qualquer variável é um tipo primitivo ou um tipo de referência. Os argumentos de tipo genérico devem ser tipos de referência. Como os primitivos não se estendem, Objecteles não podem ser usados ​​como argumentos de tipo genérico para um tipo parametrizado.

Em vez disso, use a Integerclasse que é um wrapper para int:

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

Se estiver usando o Java 7, você pode simplificar esta declaração usando o operador diamante:

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

Com autoboxing em Java, o tipo primitivo intse tornará um Integerquando necessário.

Autoboxing é a conversão automática que o compilador Java faz entre os tipos primitivos e suas classes de wrapper de objetos correspondentes.

Portanto, o seguinte é válido:

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

System.out.println(list.get(0)); //prints 1
Kevin Bowersox
fonte
Portanto, o método JTable setSelectedIndices não faz sentido: docs.oracle.com/javase/8/docs/api/javax/swing/…
vdolez
25

Não, não há nenhuma coleção que possa conter tipos primitivos quando o Java Collection Framework está sendo usado.

No entanto, existem outras coleções java que suportam tipos primitivos, como: Trove , Colt , Fastutil , Guava

Um exemplo de como um arraylist com ints seria quando a Trove Library fosse usada é o seguinte:

 TIntArrayList list= new TIntArrayList();

O desempenho dessa lista, quando comparada com a ArrayList de inteiros de coleções Java, é muito melhor, pois o autoboxing / unboxing para a classe de invólucro inteiro correspondente não é necessário.

Mike B
fonte
1
Não consegui encontrar uma implementação de coleção primitiva no Guava. Você pode fornecer um link, por favor?
nimcap
9

Existe uma maneira de criar uma lista de int primitivos ou quaisquer primitivos em java

Não, você não pode. Você só pode criar lista de tipos de referência, como Integer, Stringou seu tipo personalizado.

Parece que posso fazer List myList = new ArrayList();e adicionar "int" a esta lista.

Quando você adiciona inta esta lista, é automaticamente encaixotado para o Integertipo de invólucro. Mas é uma má ideia usar listas de tipo bruto , ou para qualquer tipo genérico nesse caso, em código mais recente.

Posso adicionar qualquer coisa a esta lista.

Claro, essa é a desvantagem de usar o tipo bruto. Você pode ter gato , cachorro , tigre , dinossauro , tudo em um recipiente.

É minha única opção, criar um array de int e convertê-lo em uma lista

Nesse caso também, você receberá List<Integer>apenas um . Não há como você criar List<int>ou quaisquer primitivos.

Você não deve ser incomodado de qualquer maneira. Mesmo em List<Integer>você pode adicionar inttipos primitivos. Será encaixotado automaticamente, conforme o exemplo abaixo:

List<Integer> list = new ArrayList<Integer>();
list.add(5);
Rohit Jain
fonte
Boa discussão sobre o tipo bruto.
Kevin Bowersox
Na verdade, para ficar claro, você pode criar uma lista com tipos primitivos usando apenas um array básico. int [] array = new int [10];
Taylor
1
@Taylor Mas essa lista não vai aumentar dinamicamente. Isso é uma matriz. E suponho que OP já esteja sabendo disso.
Rohit Jain
5

Isso não é possível. A especificação java proíbe o uso de primitivos em genéricos. No entanto, você pode criar ArrayList<Integer>e chamar add(i)se ifor um int graças ao boxe.

nanofarad
fonte
4

Você pode usar coleções primitivas disponíveis em Eclipse Collections . Eclipse Colecções tem List, Set, Bage Mappara todos os primitivos. Os elementos nas coleções primitivas são mantidos como primitivos e nenhum boxing ocorre.

Você pode inicializar um IntList assim:

MutableIntList ints = IntLists.mutable.empty();

Você pode converter de a List<Integer>para IntListassim:

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

Nota: Sou um contribuidor das Coleções Eclipse.

Nikhil Nanivadekar
fonte
2

As coleções usam genéricos que suportam tipos de referência ou wilcards. No entanto, você pode usar um Integerinvólucro

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

Quando você usa Java para desenvolvimento Android, é recomendado usar SparseIntArraypara evitar autoboxing entre inte Integer.

Você pode encontrar mais informações SparseIntArrayna documentação do Android Developers e uma boa explicação para autoboxing no Android. Insira a descrição do link aqui

Stefan Medack
fonte
Essa é uma declaração forte. Certamente SparseIntArrayé freqüentemente uma opção melhor, mas há vantagens e desvantagens a serem observadas. "A implementação não se destina a ser apropriada para estruturas de dados que podem conter um grande número de itens. Geralmente é mais lento do que um HashMap tradicional ..."
Andy Thomas
Sim, é verdade. Eles cobrem muito bem essa compensação no vídeo que vinculei. Mas o OP pediu essa possibilidade particular e eu só queria acrescentar que é realmente possível com o Android e também recomendado para a maioria dos casos de uso. Obrigado por adicionar essa informação!
Stefan Medack
0

Existe uma maneira de converter uma matriz Integer [] em uma matriz int []?

Essa omissão grosseira das bibliotecas principais do Java parece ocorrer em quase todos os projetos em que já trabalho. E por mais conveniente que a biblioteca Trove possa ser, não consigo analisar os requisitos precisos para atender ao LPGL para um aplicativo Android que vincula estaticamente uma biblioteca LGPL (o preâmbulo diz ok, o corpo não parece dizer o mesmo). E é simplesmente inconveniente extrair e remover fontes do Apache para obter essas classes. Tem que haver uma maneira melhor.

Robin Davies
fonte
-4

A coleção Java deve ser apenas coleções de objetos.

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

Integer é uma classe de wrapper do tipo de dados primitivo int.

mais das classes de wrapper JAVA aqui !

Você pode salvar e obter int de / para integerList diretamente como, integerList.add(intValue); int intValue = integerList.get(i)

Selvaraj
fonte
1
A primeira linha não compila e as duas últimas linhas de código estão em todos os lugares. Por favor, evite fazer isso.
The_Martian de