Como criar uma nova lista em Java


762

Criamos um Setcomo:

Set myset = new HashSet()

Como criamos um Listem Java?


1
No javadoc para List. "Todas as classes de implementação conhecidas: AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack, Vector"
— KitsuneYMG

121
Esta questão é um dos hits top Google por "java criar uma lista" e tem um conjunto muito útil de respostas, então parece ser uma pergunta bastante razoável para mim :-)
— Josephh

52
É uma boa pergunta com boas respostas. Um dos objetivos do Stack Overflow é criar algum tipo de resposta canônica para perguntas de programação, pelo menos de acordo com os fundadores do site. Portanto, tente evitar o voto negativo nesse tipo de post no futuro, se você puder resistir à tentação.
— eggonlegs

Respostas:


977
List myList = new ArrayList();

ou com genéricos ( Java 7 ou posterior)

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

ou com genéricos (versões antigas do java)

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

68
Observe que ArrayList não é o único tipo de lista - e, com relação à pergunta, HashSet não é o único tipo de conjunto.
— magro

17
Estou surpreso que ninguém tenha mencionado que você pode consultar a interface da lista na documentação Java para obter uma lista definitiva de todas as classes que implementam a Lista: docs.oracle.com/javase/7/docs/api/java/util /List.html
— David Mason

5
Se você usa um IDE, geralmente também pode visualizar uma hierarquia de tipos, o que pode ser mais conveniente. No Eclipse, o atalho padrão é F4 e, no IDEA, é Ctrl + H.
— David Mason

1
Pelo que eu entendo que você não pode usar os genéricos com ArrayList em C # MSDN
— JohnOsborne

5
O segundo argumento de tipo explícito <MyType> pode ser substituído por apenas <> para Java 7 e 8. #
— 301 Jannik

469

Além disso, se você deseja criar uma lista que contenha itens (embora seja de tamanho fixo):

List<String> messages = Arrays.asList("Hello", "World!", "How", "Are", "You");

15
A ressalva é que esse tipo de lista (a retornada por asList ()) é imutável.
— Avrom

70
@Avron - errado: ele só é tamanho fixo: você não pode alterar o tamanho, mas você pode alterar o conteúdo (ressalva da ressalva?)
— user85421

Impressionante. Obrigado por ser conciso.
— R Claven

1
se houver apenas uma coisa na lista, eu uso Collections.singletonList () em vez de Arrays.asList (). (Mas, eu acho, eu não sei por que.)
— MikeB

@ MikeB se você não sabe por que, em seguida, manter o arrays.aslist
— bharal 30/01

183

Deixe-me resumir e adicionar algo:

JDK

1. new ArrayList<String>();
2. Arrays.asList("A", "B", "C")

Goiaba

1. Lists.newArrayList("Mike", "John", "Lesly");
2. Lists.asList("A","B", new String [] {"C", "D"});

Lista imutável

1. Collections.unmodifiableList(new ArrayList<String>(Arrays.asList("A","B")));
2. ImmutableList.builder()                                      // Guava
            .add("A")
            .add("B").build();
3. ImmutableList.of("A", "B");                                  // Guava
4. ImmutableList.copyOf(Lists.newArrayList("A", "B", "C"));     // Guava

Lista imutável vazia

1. Collections.emptyList();
2. Collections.EMPTY_LIST;

Lista de Personagens

1. Lists.charactersOf("String")                                 // Guava
2. Lists.newArrayList(Splitter.fixedLength(1).split("String"))  // Guava

Lista de Inteiros

Ints.asList(1,2,3);                                             // Guava

Ints.asListnão cria uma lista imutável, mas uma lista de tamanho fixo, apoiada por um determinado conjunto de entradas (isto é, suporta List.set(int, Object)). O segundo exemplo de "Lista imutável de caracteres" também não é imutável (eu removeria essa linha).
— Xaerxess

9
Não usar genéricos é um exemplo realmente "bom" para qualquer desenvolvedor que leia isso.
— Natix 16/04

60

No Java 8

Para criar uma lista não vazia de tamanho fixo (operações como adicionar, remover etc., não são suportadas):

List<Integer> list = Arrays.asList(1, 2); // but, list.set(...) is supported

Para criar uma lista mutável não vazia:

List<Integer> list = new ArrayList<>(Arrays.asList(3, 4));

No Java 9

Usando um novo List.of(...)método estático de fábrica:

List<Integer> immutableList = List.of(1, 2);

List<Integer> mutableList = new ArrayList<>(List.of(3, 4));

No Java 10

Usando a inferência de tipo de variável local :

var list1 = List.of(1, 2);

var list2 = new ArrayList<>(List.of(3, 4));

var list3 = new ArrayList<String>();

E siga as práticas recomendadas ...

Não use tipos brutos

Desde o Java 5, os genéricos fazem parte da linguagem - você deve usá-los:

List<String> list = new ArrayList<>(); // Good, List of String

List list = new ArrayList(); // Bad, don't do that!

Programa para interfaces

Por exemplo, programe para a Listinterface:

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

Ao invés de:

ArrayList<Double> list = new ArrayList<>(); // This is a bad idea!

1
Oi, você poderia sugerir onde eu posso aprender essas diferenças e a evolução do Java? Parece muito interessante!
— shiv

31

Primeiro leia isto , depois leia isto e aquilo . 9 em cada 10 vezes, você usará uma dessas duas implementações.

De fato, basta ler o Guia do Sun para a estrutura de coleções .


11
Eu até mesmo adicionar "8 vezes fora de 10" você vai usar ArrayList, só porque ele simplesmente não importa em 9,9 vezes de 10.
— Joachim Sauer

1
O LinkedList é semanticamente apropriado quando você realmente se importa com os fins.
— 23611 Adam Jaskiewicz

As LinkedLists são excelentes se você apenas iterar sobre elas. Para mim, parece que as listas vinculadas são mais elegantes, mas talvez seja apenas porque eu aprendi o lisp antes do Java.
— 194 KarlP

@Karlp concordou. Eu diria que são 50/50 na maioria das vezes entre ArrayList e LinkedList, e a resposta nem sempre é sobre a complexidade das operações; mais frequentemente, é simplesmente o que parece certo para o problema em questão.
— Adam Jaskiewicz

1
Eu quase sempre usei ArrayList. Se eu estiver trabalhando apenas com os fins de uma lista, é um deque (ou fila) e eu uso a ArrayDequeimplementação. O motivo é que, embora as implementações baseadas em matriz possam desperdiçar alguma memória em slots vazios (quando não posso prever a capacidade necessária), para pequenas coleções, isso é comparável à sobrecarga de todas as instâncias de nó em uma lista vinculada ( ou deque). E, em troca, recebo acesso aleatório. Que benefício exclusivo LinkedListoferece?
— 22613 Erickson

21
//simple example creating a list form a string array

String[] myStrings = new String[] {"Elem1","Elem2","Elem3","Elem4","Elem5"};

List mylist = Arrays.asList(myStrings );

//getting an iterator object to browse list items

Iterator itr= mylist.iterator();

System.out.println("Displaying List Elements,");

while(itr.hasNext())

  System.out.println(itr.next());

21

Desde o Java 7, você tem inferência de tipo para criação de instância genérica , portanto, não há necessidade de duplicar parâmetros genéricos no lado direito da atribuição:

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

Uma lista de tamanho fixo pode ser definida como:

List<String> list = Arrays.asList("foo", "bar");

Para listas imutáveis, você pode usar a biblioteca Guava :

List<String> list = ImmutableList.of("foo", "bar");

Eu tenho uma pergunta sobre esta declaração List <> lista = Arrays.asList ("foo", "bar"); Gostaria de saber se a lista na declaração é um objeto?

20

A lista é apenas uma interface, assim como definido .

Como o HashSet é uma implementação de um conjunto que possui determinadas propriedades em relação à adição / pesquisa / remoção de desempenho, ArrayList é a implementação simples de uma lista.

Se você olhar a documentação para as respectivas interfaces, encontrará "Todas as classes de implementação conhecidas" e poderá decidir qual é a mais adequada para suas necessidades.

As chances são de que seja ArrayList .


18

Listé uma interface como Sete tem ArrayListe LinkedListcomo implementações de uso geral .

Podemos criar a lista como:

 List<String> arrayList = new ArrayList<>();
 List<String> linkedList = new LinkedList<>(); 

Também podemos criar uma lista de tamanho fixo como:

List<String> list = Arrays.asList("A", "B", "C");

Quase sempre estaríamos usando ArrayListoposição à LinkedListimplementação:

  1. LinkedList usa muito espaço para objetos e apresenta um desempenho ruim quando temos muitos elementos.
  2. Qualquer operação indexada em LinkedListrequer tempo O (n) comparado a O (1) em ArrayList.
  3. Verifique este link para mais informações.

A lista criada Arrays.asListacima não pode ser modificada estruturalmente, mas seus elementos ainda podem ser modificados.

Java 8

Conforme o documento , o método Collections.unmodifiableListretorna uma visão inalterável da lista especificada. Podemos obtê-lo como:

Collections.unmodifiableList(Arrays.asList("A", "B", "C"));

Java 9

Caso esteja usando o Java 9, então:

List<String> list = List.of("A", "B");

Java 10

Caso estejamos no Java 10, o método Collectors.unmodifiableListretornará uma instância da lista realmente não modificável introduzida no Java 9. Verifique esta resposta para obter mais informações sobre a diferença entre Collections.unmodifiableList vs Collectors.unmodifiableListno Java 10 .


9

Às vezes - mas apenas muito raramente - em vez de uma nova ArrayList, você pode querer uma nova LinkedList. Comece com ArrayList e se você tiver problemas de desempenho e evidências de que a lista é o problema, e adicionar e excluir muita lista - e não antes - mude para uma LinkedList e veja se as coisas melhoram. Mas, em geral, fique com o ArrayList e tudo ficará bem.


9
List list = new ArrayList();

Ou com genéricos

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

Obviamente, você pode substituir string por qualquer tipo de variável, como Inteiro, também.


7

Um exemplo:

List somelist = new ArrayList();

Você pode olhar para o javadoc para List e encontrar todas as classes de implementação conhecidas da Listinterface que estão incluídas na API Java.


7

Usando o Google Collections , você pode usar os seguintes métodos na classe Lists

import com.google.common.collect.Lists;

// ...

List<String> strings = Lists.newArrayList();

List<Integer> integers = Lists.newLinkedList();

Existem sobrecargas para a inicialização de varargs e a inicialização de um Iterable<T>.

A vantagem desses métodos é que você não precisa especificar explicitamente o parâmetro genérico, como faria com o construtor - o compilador o inferirá do tipo de variável.


6
List<Object> nameOfList = new ArrayList<Object>();

Você precisa importar Liste ArrayList.


6

Mais opções para fazer a mesma coisa com o Java 8, nem melhor nem pior, apenas diferente e, se você quiser fazer um trabalho extra com as listas, o Streams fornecerá mais alternativas (filtrar, mapear, reduzir etc.)

List<String> listA = Stream.of("a", "B", "C").collect(Collectors.toList());
List<Integer> listB = IntStream.range(10, 20).boxed().collect(Collectors.toList());
List<Double> listC = DoubleStream.generate(() -> { return new Random().nextDouble(); }).limit(10).boxed().collect(Collectors.toList());
LinkedList<Integer> listD = Stream.iterate(0, x -> x++).limit(10).collect(Collectors.toCollection(LinkedList::new));

6

Com o Java 9, você pode fazer o seguinte para criar um imutável List :

List<Integer> immutableList = List.of(1, 2, 3, 4, 5);

List<Integer> mutableList = new ArrayList<>(immutableList);

6

Como opção, você pode usar a inicialização entre chaves aqui:

List<String> list = new ArrayList<String>(){
  {
   add("a");
   add("b");
  }
};

2
Esta é uma operação cara. Você está criando uma subclasse anônima de ArrayList aqui.
— Vikram Bodicherla

@VikramBodicherla Concordo. É mais sobre açúcar de sintaxe aqui.
— angry_gopher


5
List arrList = new ArrayList();

É melhor usar genéricos, conforme sugerido abaixo:

List<String> arrList = new ArrayList<String>();

arrList.add("one");

Caso você use o LinkedList.

List<String> lnkList = new LinkedList<String>();

4

Usando o Eclipse Collections, você pode criar uma Lista como esta:

List<String> list1 = Lists.mutable.empty();
List<String> list2 = Lists.mutable.of("One", "Two", "Three");

Se você deseja uma lista imutável:

ImmutableList<String> list3 = Lists.immutable.empty();
ImmutableList<String> list4 = Lists.immutable.of("One", "Two", "Three");

Você pode evitar o encaixotamento automático usando listas primitivas. Veja como você criaria listas int:

MutableIntList list5 = IntLists.mutable.empty();
MutableIntList list6 = IntLists.mutable.of(1, 2, 3);

ImmutableIntList list7 = IntLists.immutable.empty();
ImmutableIntList list8 = IntLists.immutable.of(1, 2, 3);

Existem variantes para todas as 8 primitivas.

MutableLongList longList       = LongLists.mutable.of(1L, 2L, 3L);
MutableCharList charList       = CharLists.mutable.of('a', 'b', 'c');
MutableShortList shortList     = ShortLists.mutable.of((short) 1, (short) 2, (short) 3);
MutableByteList byteList       = ByteLists.mutable.of((byte) 1, (byte) 2, (byte) 3);
MutableBooleanList booleanList = BooleanLists.mutable.of(true, false);
MutableFloatList floatList     = FloatLists.mutable.of(1.0f, 2.0f, 3.0f);
MutableDoubleList doubleList   = DoubleLists.mutable.of(1.0, 2.0, 3.0);

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


4

A seguir, algumas maneiras de criar listas.

  • Isso criará uma lista com tamanho fixo, não é possível adicionar / remover elementos, ele exibirá um java.lang.UnsupportedOperationExceptionse você tentar fazer isso.

    List<String> fixedSizeList = Arrays.asList(new String[] {"Male", "Female"});


  • A versão a seguir é uma lista simples onde você pode adicionar / remover qualquer número de elementos.

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


  • Isto é como criar um LinkedListem java. Se você precisar inserir / excluir com freqüência elementos na lista, use em LinkedListvez deArrayList

    List<String> linkedList = new LinkedList<>();

1
Você pode usar Arrays.asList("Male", "Female").
— 19419 Johny

3

Tente o seguinte:

List<String> messages = Arrays.asList("bla1", "bla2", "bla3");

Ou:

List<String> list1 = Lists.mutable.empty(); // Empty
List<String> list2 = Lists.mutable.of("One", "Two", "Three");

2

Se você precisar de uma lista serializável e imutável com uma única entidade, poderá usar:

List<String> singList = Collections.singletonList("stackoverlow");

2

Como a declaração da lista de matrizes em java é como

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable  

Há várias maneiras de criar e inicializar a lista de matrizes em java.

 1) List list = new ArrayList();

 2) List<type> myList = new ArrayList<>();

 3) List<type> myList = new ArrayList<type>();

 4) Using Utility class

    List<Integer> list = Arrays.asList(8, 4);
    Collections.unmodifiableList(Arrays.asList("a", "b", "c"));

 5) Using static factory method

    List<Integer> immutableList = List.of(1, 2);


 6) Creation and initializing at a time

    List<String> fixedSizeList = Arrays.asList(new String[] {"Male", "Female"});



 Again you can create different types of list. All has their own characteristics

 List a = new ArrayList();
 List b = new LinkedList();
 List c = new Vector(); 
 List d = new Stack(); 
 List e = new CopyOnWriteArrayList();
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.