Através de uma hierarquia de interfaces, a linguagem Java implementa e disponibiliza classes que definem os mais variados tipos de coleções a fim auxiliar no desenvolvimento de aplicações.
As classes do framework de coleções do Java livram o programador da necessidade de implementar complicadas estruturas de dados para gerenciar coleções de objetos facilitando, portanto, o desenvolvimento de aplicações, acelerando o desenvolvimento e simplificando o intercâmbio de dados ao viabilizar uma implementação mais rápida, eficiente e padronizada com o reuso de coleções que são amplamente adotadas no mundo Java.
A implementação de coleções na linguagem Java, antes do Java 2 (JDK 1.2), incluía poucas classes, como Vector e HashTable, e não tinha a forma e organização de um framework.
o lançamento do Java 2, no entanto, foram criadas novas classes e interfaces para organizar os mais diversos tipos de coleções agora existentes, originando assim o Java Collections Framework.
Com este framework, o Java ganhou componentes comuns – reutilizáveis para diversas aplicações – que usam coleções de dados para atender as mais variadas finalidades de coleções, como listas, conjuntos, pilhas, vetores, entre outros.
Algum tempo depois, já no Java 5, foram adicionados diversos recursos ao framework de coleções devido à criação de Generics, o que permitiu criar coleções “tipadas”, isto é, coleções cujos elementos são restritos a um determinado tipo em vez de Object.
Além disso, com o Java 5, foi criado também o laço "for melhorado" (enhanced for), possibilitando percorrer qualquer coleção facilmente.
Passados alguns anos, com o lançamento do Java 7, mais melhorias foram realizadas no framework de coleções e foi criado o operador diamante, que simplifica a instanciação de objetos (coleções) usando Generics.
No Java Collections Framework, através de interfaces, são definidos e organizados os mais diversos tipos de coleções, de forma que são oferecidas classes que implementam os mais variados padrões de coleções, como mostra na Figura 1.
A interface java.util.Iterable está no topo da hierarquia de interfaces do framework e sua principal função é definir que qualquer coleção filha seja iterável pelo laço de repetição “for melhorado”. Para isso, ela disponibiliza alguns métodos, sendo iterator() o método principal, que retorna um objeto que implementa a interface Iterator.
Através da interface java.util.Iterator pode-se percorrer qualquer coleção facilmente, pois além da vantagem de se usar o “for melhorado”, é uma interface que define alguns métodos que permitem percorrer qualquer tipo de coleção. Os principais métodos são:
- boolean hasNext(): retorna true se existem mais elementos a serem acessados na coleção vinculada a esse Iterator;
- E next(): retorna o próximo elemento disponível na coleção vinculada a esse iterator;
- void remove(): remove da coleção o último elemento acessado através desse Iterator.
Observe que tanto Iterable como Iterator fazem uso de Generics. Sendo assim, em vez de apenas criar coleções para armazenar objetos do tipo Object, é possível que sejam criadas coleções “tipadas”, restringindo o tipo de objeto que a coleção pode armazenar (este recurso é denotado pelo <E> na Figura 1), aumentando assim o controle da coleção pelo programador, uma vez que esse recurso permite descobrir erros de programação em tempo de compilação.
Como resultado do uso de Generics na interface Iterable, a sua interface filha java.util.Collection também pode ser parametrizada com um tipo usando Generics.
Como Collection é a interface mãe de quase todos os tipos de coleções, as funcionalidades conferidas a ela através de Generics são automaticamente herdadas por todas as coleções filhas.
A interface Collection tem a função de definir muitas das funcionalidades comuns a quase todas as coleções e será por ela que iniciaremos esse artigo.
A interface Collection
A maioria das coleções em Java derivam da interface java.util.Collection, que define métodos comuns entre todas elas com o objetivo de padronizar muitas das operações básicas suportadas em cada tipo de coleção, a saber:
- boolean add(E e): adiciona um elemento à coleção;
- boolean addAll(Collection<? extends E> c): adiciona à coleção todos os elementos da coleção passada como parâmetro;
- void clear(): Esvazia essa collection, mas não elimina da memória os objetos que ela referenciava, a não ser que não haja mais nenhuma outra referência para os mesmos;
- boolean contains(Object o): retorna true se a coleção contém o elemento informado como parâmetro;
- boolean containsAll(Collection<?> c): retorna true se a coleção contém todos os elementos da coleção informada como parâmetro;
- boolean isEmpty(): retorna true se a coleção não tem elementos;
- Iterator<E> iterator(): retorna um Iterator para percorrer os elementos da coleção. Uma coleção pode ser percorrida por um Iterator usando o for melhorado;
- boolean remove(Object o): remove da coleção o elemento informado como parâmetro;
- boolean removeAll(Object o): remove da coleção todos os elementos da coleção informada como parâmetro;
- int size(): Retorna a quantidade de elementos da coleção;
- Object[] toArray(): converte essa coleção para um array de Object.
Como a interface Collection define o tipo mais alto na hierarquia de coleções, as suas interfaces filhas definem tipos mais especializados, como as interfaces List, Set, SortedSet, Queue, Deque, entre outras, que automaticamente herdam todos os seus métodos. As principais interfaces filhas de Collection serão apresentadas a seguir.
A interface List
A interface java.util.List tem o objetivo de definir coleções que têm a função de servirem como arrays de tamanho dinâmico, de forma que cada elemento seja acessível por um índice, que é a posição do elemento no array. Além disso, novos elementos podem ser criados ou removidos em qualquer posição e pode haver elementos duplicados.
As principais classes que descendem da interface List são ArrayList, Vector, LinkedList e Stack, sendo seus principais métodos listados a seguir (observe que foram omitidos os métodos herdados de Collection):
- void add(int index, E element): Insere o elemento especificado na posição passada como parâmetro;
- E get (int index): Retorna o elemento de uma posição especificada;
- Int indexOf(Object o): Retorna a posição do objeto passado como parâmetro. Se o objeto não existe, retorna -1;
- E remove(int index): Remove o elemento presente no índice indicado como parâmetro;
- E set(int index, E element): Faz com que o objeto informado como parâmetro ocupe a posição informada no parâmetro index. Se a posição já estiver ocupada, substitui o valor presente;
-
void sort(Comparator<? super E> c): Ordena o List de acordo com o critério implementado no
Comparator passado como ...
Quer ler esse conteúdo completo? Tenha acesso completo