terça-feira, 20 de novembro de 2012

Coleções em Java - Parte I

Uma coleção de objetos em Java é um agregado ou agrupamento de referências a objetos (não o objeto em si), em alguma estrutura de dados. Cada objeto é um elemento da coleção.

Em Java temos um framework para representar coleções, permitindo manipular os elementos da coleção e a própria coleção, independentemente dos detalhes de sua representação, reduzindo o esforço para o programador. Este framework é composto por:

  • Interfaces: que permitem que as coleções sejam manipuladas independentes de suas implementações;
  • Implementações: são as classes que implementam uma ou mais interfaces do framework;
  • Algoritmos: são métodos que realizam operações como sort, reverse, binarysearch, etc sobre as coleções.



As principais coleções (implementações) são:



1) Set: são conjuntos de objetos e portanto seu comportamento está ligado à ideia subjacente aos conjuntos, assim como em um conjunto as classes que implementam esta interface não podem ter elementos repetidos.
  • HashSet: esta classe implementa um conjunto e ao mesmo tempo um método de acesso utilizando uma tabela hash (uma instância de HashMap)
  • LinkedHashSet: é uma implementação de tabela hash com listas encadeadas. Diferente do HashSet é mantida uma lista duplamente encadeada entre os elementos, com isto temos definida a ordem da iteração que é a ordem de inserção
  • TreeSet: implementado como uma árvore rubro-negra, gerando um conjunto ordenado de acordo com a ordenação natural dos elementos. É possível implementar um Comparator que especifica qual a ordem será seguida.
  • EnumSet: utilizada para type enumerados (Enum class). Todos os elementos de um EnumSet devem ser de um único tipo enumerado que é especificado implicita ou explicitamente quando o set é criado.
2) Deque: é uma implementação linear que suporta inserção e remoção nas duas extremidades (início e fim da lista). Deque quer dizer "double ended queue". Esta interface, diferentemente de List, não fornece suporte para indexação dos elementos.
  • LinkedList: é uma coleção implementada sob a forma de uma lista duplamente encadeada. Esta implementação também realiza a interface de List.
  • ArrayDeque: é uma implementação de um Array redimensionável, crescendo de acordo com a necessidade
3) Listas (List): implementa uma sequência de objetos ordenados, permitindo que os objetos sejam acessados por um índice. Diferente dos conjuntos, as listas suportam objetos duplicados.
  • ArrayList: implementada com Array
  • LinkedList: mesma implementação vista em Deque. As diferenças ocorrem no tipo de implementação. Por exemplo, em uma implementação com lista podemos utilizar o método .add(int index, E element) que permite inserir em uma posição específica. Se estivéssemos implementando somente Deque, usaríamos .add(E element), que insere no final da lista. O mesmo vale para .get() e .remove().
4) Pilhas (Stack)
  • Stack: implementa uma pilha no formato LIFO (last in first out), estendendo a classe Vector. Possui os métodos clássicos pop() e push() para manipular os objetos.
5) Mapas (Map): esta interface realiza o mapeamento entre dois valores no formato Map<K,V> onde K é a chave de acesso para o objeto V. Um mapa não pode ter chaves K duplicadas. Em termos acadêmicos, um mapa não é realmente uma coleção, é uma interface que implementam operações de visualização de coleções.
  • HashMap: é uma implementação de uma tabela hash
  • TreeMap: é uma implementação de árvore rubro-negra, sendo a ordenação fornecida pela ordem natural dos elementos ou por um Comparator atribuído na criação do mapa
  • LinkedHashMap: é uma implementação que une tabela hash e listas encadeadas (duplamente encadeada)
  • EnumMap: é uma implementação específica para utilização de tipos enumerados como chaves do mapa. Nesta implementação, todas as chaves devem vir de um único tipo enumerado.
Em um próximo post vamos  ver alguns exemplos.

Nenhum comentário:

Postar um comentário