• Skip to primary navigation
  • Skip to content

Mauda

IT, Java and Music

Graduação   SCJP   Mestrado
  • Apresentação
  • Certificação Java
  • JPA
    • Exceptions
  • JSF
  • Versionamento
  • Contato

Java Collections Framework – Basico do Basico

April 8, 2019 by Mauda Leave a Comment

Conteúdo do Post:
  1. Histórico
  2. Hierarquia da JCF
  3. Operações comuns
  4. Construindo a “Estante”
  5. Adicionando carrinhos a “Estante”
  6. Verificando se já tenho esse carrinho na “Estante”
  7. Passando por todos os carrinhos da “Estante”
  8. Doando um Carrinho ou a coleção inteira
  9. Outras formas de brincar
  10. finnaly{

Olá Pessoal, tudo bom?

Hoje vamos falar sobre o as coleções em Java ou Java Collections Framework. Veja na continuação:

Histórico

A Java Collections Framework (JCF) foi criada na release 2 da JDK, ou seja, há muitos anos. A definição da Oracle para a JCF é a seguinte:

Um objeto que representa um grupo de objetos. A Java Collections Framework é uma arquitetura unificada que tem a responsabilidade de representar e manipular coleções. Essa manipulação ocorre independente dos detalhes de implementação o qual são encapsulados ao usuário.

Com essa definição da Oracle sobre a JCF podem ser retirados três pontos muito importantes:

  • A definição por si só é recursiva. “Um objeto que representa um grupo de objetos”
  • Existe uma implementação para os tipos mais comuns de estrutura de dados
  • Existe uma hierarquia muito bem amarrada de interfaces e implementações para esses tipos mais comuns, onde a classe base é a java.util.Collection além da java.util.Map

Dessa forma podemos elencar alguns pontos importantes do porque é importante aprender e utilizar a JCF:

  • Reduz o esforço de programação, já que não é necessário reinventar as estruturas de dados e seus algoritmos
  • Oferece uma implementação de alta performance para essas estruturas
  • Estabelece uma interoperabilidade entre todas as APIs do Java, já que é um framework da base do Java
  • Torna mais fácil, entender e utilizar coleções

Com o advento do Java 5, a JCF teve uma excelente adição dos Generics.

Com o advento do Java 8, a JCF teve outra excelente adição com os Streams.

 

Hierarquia da JCF

Diversas estruturas estão presentes na JCF, como por exemplo Lists, Queues e Sets, como a Figura 01 mostra as interfaces e classes existentes.

Figura 01 – Hierarquia da JCF

Todas essas interfaces e classes, provém métodos de inserção, deleção, busca, ordenação, manipulação de elementos. Lembrando também que algumas estruturas de dados permitem apenas objetos únicos, por exemplo Sets, enquanto outras estruturas permitem duplicações como ArrayLists. Cada estrutura de dados pode trazer um ganho de produtividade se utilizada corretamente.

É importante salientar que a interface Map também está presente na JCF, mas ela não é “filha” de Collection. É uma interface base fora da hierarquia da Collection.

 

Operações comuns

Para essa parte do artigo iremos nos basear na interface java.util.Collection. Ou seja, iremos observar sua API e trabalhar com os métodos que existem nessa interface a fim de exemplificar sua utilização.

 

Construindo a “Estante”

Se queremos guardar carrinhos hot wheels primeiro temos que ter um caminhão estante, senão onde iremos guardar???

Não adianta nada termos vários elementos a serem armazenados em uma coleção se não criarmos essa coleção, além disso, lembre-se uma interface não pode ser instanciada, apenas classes. A maioria das classes que estão dentro da JCF utilizam um construtor default simples para criar a coleção. Por exemplo, como criar uma instância de ArrayList:

Java
1
2
3
4
5
6
7
8
9
10
11
12
package br.com.mauda.collections;
 
import java.util.ArrayList;
import java.util.Collection;
 
public class CollectionsTeste {
 
    public static void main(String[] args) {
        Collection<String> palavras = new ArrayList<>();
    }
 
}

 

É uma prática importante criar uma instância de classe concreta e atribuir em uma interface. Além de facilitar o reuso, pois em qualquer lugar posso utilizar List ou qualquer classe que implemente a interface, existem algumas bibliotecas que obrigam aos atributos de uma classe serem do tipo da interface, como o JPA.

 

Adicionando carrinhos a “Estante”

Uma vez criada a collection é possível agora adicionar elementos. Para isso podemos utilizar os seguintes métodos:

boolean add​(E e)  – Adiciona um elemento do tipo E a collection.
boolean addAll​(Collection<? extends E> c) – Adiciona todos os elementos que estão contidos na Collection do tipo E

Vamos incrementar nosso exemplo adicionando 3 strings conforme mostram as linhas 10 a 12:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package br.com.mauda.collections;
 
import java.util.ArrayList;
import java.util.Collection;
 
public class CollectionsTeste {
 
    public static void main(String[] args) {
        Collection<String> palavras = new ArrayList<String>();
        palavras.add("Java");
        palavras.add("Collections");
        palavras.add("Framework");
    }
 
}

 

Verificando se já tenho esse carrinho na “Estante”

Assim como é possível adicionar elementos, é possível verificar se já existe determinado elemento ou elementos na collection. Ambos os métodos utilizam o método equals para verificar se a instância é igual. Assim é importante nas suas classes, principalmente sua entidades model sobreescrever esse método.

boolean contains​(Object o) – Retorna verdadeiro se o elemento informado está dentro da coleção
boolean containsAll​(Collection<?> c) – Reetorna verdadeiro se TODOS os elementos da coleção passada como parâmetro estão dentro da coleção

Vamos incrementar nosso exemplo adicionando 2 comparações conforme mostram as linhas 13 e 14. O resultado será true para a primeira comparação e false para a segunda:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package br.com.mauda.collections;
 
import java.util.ArrayList;
import java.util.Collection;
 
public class CollectionsTeste {
 
    public static void main(String[] args) {
        Collection<String> palavras = new ArrayList<String>();
        palavras.add("Java");
        palavras.add("Collections");
        palavras.add("Framework");
        System.out.println("Contém 'Collections': " + palavras.contains("Collections"));
        System.out.println("Contém 'Coll': " + palavras.contains("Coll"));
    }
 
}

Resultado da execução:

Shell
1
2
Contém 'Collections': true
Contém 'Coll': false

 

Passando por todos os carrinhos da “Estante”

Existem métodos na interface Collection que permitem você iterar sobre a coleção. Para tanto você pode utilizar de três formas distintas:

  • Utilizando Iterators – Linhas 17 a 23
  • Utilizando for-each (A partir do Java 5) – Linhas 25 a 29
  • Utilizando Streams (A partir do Java 8) – Linhas 31 a 33

Cada exemplo foi retratado nas linhas a seguir do nosso código:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package br.com.mauda.collections;
 
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
 
public class CollectionsTeste {
 
    public static void main(String[] args) {
        Collection<String> palavras = new ArrayList<String>();
        palavras.add("Java");
        palavras.add("Collections");
        palavras.add("Framework");
        System.out.println("Contém 'Collections': " + palavras.contains("Collections"));
        System.out.println("Contém 'Coll': " + palavras.contains("Coll"));
 
        // Usando Iterator
        Iterator<String> iterator = palavras.iterator();
        System.out.println("\nUtilizando Iterator:");
        while (iterator.hasNext()) {
            String palavra = iterator.next();
            System.out.println(palavra);
        }
 
        // Usando For Each
        System.out.println("\nUtilizando ForEach:");
        for (String palavra : palavras) {
            System.out.println(palavra);
        }
 
        // Usando Streams
        System.out.println("\nUtilizando Streams:");
        palavras.stream().forEach(p -> System.out.println(p));
    }
 
}

Resultado da execução:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Contém 'Collections': true
Contém 'Coll': false
 
Utilizando Iterator:
Java
Collections
Framework
 
Utilizando ForEach:
Java
Collections
Framework
 
Utilizando Streams:
Java
Collections
Framework

 

Doando um Carrinho ou a coleção inteira

Pode ser necessário a remoção de um elemento da collection ou até mesmo a limpeza total, deletando todos os elementos existentes. Para tanto existem os métodos abaixo que auxiliam nessa missão:

void clear() – remove todos os elementos de uma collection
boolean remove(Element e) – remove o elemento e se estiver presente na coleção. É retornado true se o elemento estava presente
boolean removeAll(Collection c) – remove da collection todos os elementos que foram passados como parâmetro retornando true se algum elemento estava presente
boolean removeIf(Predicate filter) – remove da collection os elementos que atendem o predicado. Para maior detalhe verificar o artigo removeIf

Abaixo iremos colocar os métodos clear e remove(Element) para mostrar a remoção da string Collection e da limpeza total da lista:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package br.com.mauda.collections;
 
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
 
public class CollectionsTeste {
 
    public static void main(String[] args) {
        Collection<String> palavras = new ArrayList<String>();
        palavras.add("Java");
        palavras.add("Collections");
        palavras.add("Framework");
        System.out.println("Contém 'Collections': " + palavras.contains("Collections"));
        System.out.println("Contém 'Coll': " + palavras.contains("Coll"));
 
        // Usando Iterator
        Iterator<String> iterator = palavras.iterator();
        System.out.println("\nUtilizando Iterator:");
        while (iterator.hasNext()) {
            String palavra = iterator.next();
            System.out.println(palavra);
        }
 
        palavras.remove("Collections");
 
        // Usando For Each
        System.out.println("\nUtilizando ForEach:");
        for (String palavra : palavras) {
            System.out.println(palavra);
        }
 
        palavras.clear();
 
        // Usando Streams
        System.out.println("\nUtilizando Streams:");
        palavras.stream().forEach(p -> System.out.println(p));
    }
 
}

Resultado da execução:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
Contém 'Collections': true
Contém 'Coll': false
 
Utilizando Iterator:
Java
Collections
Framework
 
Utilizando ForEach:
Java
Framework
 
Utilizando Streams:

 

Outras formas de brincar

Por fim, existem alguns métodos que podemos utilizar para realizar algumas outras comparações.

isEmpty() – Retorna true se a collection está vazia
size()  – Retorna um número inteiro com a quantidade de elementos dentro da collection

Para a fim de testar colocamos alguns pontos relacionados a collection vazia e ao seu tamanho:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package br.com.mauda.collections;
 
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
 
public class CollectionsTeste {
 
    public static void main(String[] args) {
        Collection<String> palavras = new ArrayList<String>();
        palavras.add("Java");
        palavras.add("Collections");
        palavras.add("Framework");
        System.out.println("Contém 'Collections': " + palavras.contains("Collections"));
        System.out.println("Contém 'Coll': " + palavras.contains("Coll"));
 
        // Usando Iterator
        Iterator<String> iterator = palavras.iterator();
        System.out.println("\nUtilizando Iterator:");
        System.out.println("Tamanho da Collection: " + palavras.size());
        System.out.println("Collection Vazia? " + palavras.isEmpty());
        while (iterator.hasNext()) {
            String palavra = iterator.next();
            System.out.println(palavra);
        }
        
        palavras.remove("Collections");
 
        // Usando For Each
        System.out.println("\nUtilizando ForEach:");
        System.out.println("Tamanho da Collection: " + palavras.size());
        System.out.println("Collection Vazia? " + palavras.isEmpty());
        for (String palavra : palavras) {
            System.out.println(palavra);
        }
        
        palavras.clear();
 
        // Usando Streams
        System.out.println("\nUtilizando Streams:");
        System.out.println("Tamanho da Collection: " + palavras.size());
        System.out.println("Collection Vazia? " + palavras.isEmpty());
        palavras.stream().forEach(p -> System.out.println(p));
    }
 
}

Resultado da execução:

Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Contém 'Collections': true
Contém 'Coll': false
 
Utilizando Iterator:
Tamanho da Collection: 3
Collection Vazia? false
Java
Collections
Framework
 
Utilizando ForEach:
Tamanho da Collection: 2
Collection Vazia? false
Java
Framework
 
Utilizando Streams:
Tamanho da Collection: 0
Collection Vazia? true

 

finnaly{

Duvidas ou sugestões? Deixe seu feedback! Isso ajuda a saber a sua opinião sobre os artigos e melhorá-los para o futuro! Isso é muito importante!

Até um próximo post!

Filed Under: Collection, Java, JDK 8 Tagged With: add, collection, contains, isEmpty, Java, remove

About Mauda

Mestre em Informática, Analista de Sistemas, Professor, SCJP e Baterista. Desde 2002 trabalhando no mundo Java e ensinando pessoas sobre desenvolvimento de sistemas. Mais informações

Reader Interactions

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Advertisements

Copyright © 2025 · Genesis Framework · WordPress · Log in