sábado, 21 de novembro de 2009

Framework Collections do Java ==Coleções ou Estruturas de Dados Reutilizaveis --Parte 1




Framework Collections

Uma coleção - às vezes chamada de container - é simplesmente um objeto que agrupa múltiplos elementos em uma única unidade. As coleções são utilizados para armazenar, recuperar, manipular e comunicar dados agregados. Normalmente, eles representam itens de dados que formam um grupo natural, como uma mão de poker (uma coleção de cartas), uma pasta de correio (uma coleção de cartas), ou uma lista telefônica (mapeamento de nomes para números de telefone).

Se você já usou a linguagem de programação Java - ou praticamente qualquer outra linguagem de programação - você já está familiarizado com coleções. Implementações de Collection em anteriores (pré-1,2) versões da plataforma Java incluído Vector, Hashtable, e arrays. No entanto, essas versões não contêm um quadro coleções.


Um o framework de coleções é uma arquitetura unificada para representação e manipulação de coleções. Todo framework de coleções deve conter o seguinte:

  • Interfaces: Estes são os tipos de dados abstratos que representam coleções. Interfaces permitem coleções a serem manipuladas independentemente dos detalhes de sua representação. Em linguagens orientadas a objeto, interfaces geralmente formam uma hierarquia.

  • Implementações: Estas são as implementações concretas da coleção de interfaces. Em essência, eles são estruturas de dados reutilizáveis.

  • Algoritmos: Estes são os métodos que executam computações úteis, tais como busca e ordenação nos objetos que implementam as interfaces de coleta. Os algoritmos devem ser polimórficos, ou seja, o mesmo método pode ser usado em muitas implementações diferentes da interface de coleta apropriado. Em essência, os algoritmos de funcionalidade são reutilizáveis.


O Java Collections Framework fornece os seguintes benefícios ao programador:

  • Reduz o esforço de programação: Ao fornecer estruturas de dados e algoritmos úteis, com o Framework Collections você esta livre para concentrar-se as partes importantes de seu programa e não na parte de baixo nível "infraestrutura" necessária para faze-lo funcionar. Ao facilitar a interoperabilidade entre APIs não relacionadas, o Java Collections Framework te deixa livre para de escrever objetos ou adaptador de conversão de código para conectar-se API.

  • Aumenta a performance do programa e da qualidade: Framework Collections oferece alto desempenho, com implementações de alta qualidade contando com estruturas de dados úteis e algoritmos. As várias implementações de cada interface são substituíveis, assim que os programas podem ser facilmente ajustado trocando implementações coleção. Porque você está livre da labuta de escrever suas próprias estruturas de dados, você terá mais tempo para se dedicar a programas de melhoria da qualidade e desempenho.

  • Permite a interoperabilidade entre APIs não relacionadas: As interfaces de coleta são o vernáculo pelo qual APIs passar coleções frente e para trás. Se a minha administração de rede API fornece uma coleção de nomes de nó e se o seu kit de ferramentas GUI espera uma coleção de títulos de coluna, nossas APIs irá interoperar, mesmo que eles foram escritos de forma independente.

  • Reduz o esforço para aprender e usar novas APIs: APIs Muitos, naturalmente, tomar coleções na entrada e fornecer-lhes a saída. No passado, cada uma API, como tinha um pequeno sub-API dedicada a manipular suas coleções. Houve pouca consistência entre estes ad hoc sub-coleções APIs, assim que você teve para aprender cada um a partir do zero, e era fácil cometer erros quando utilizá-los. Com o advento das interfaces de recolha normal, o problema foi embora.

  • Reduz o esforço para conceber novas APIs: Este é o outro lado da vantagem anterior. Designers e implementadores não tem que reinventar a roda a cada vez que criar uma API que conta com coleções, em vez disso, eles podem usar as interfaces padrão coleção.

  • Reutilização de software Fosters: Novas estruturas de dados que estejam em conformidade com as interfaces padrão coleção são, por natureza reutilizável. O mesmo vale para novos algoritmos que operam sobre os objetos que implementam essas interfaces.


Interfaces


As interfaces principais do framework collection encapsulam diferentes tipos de coleções. Estas interfaces permitem que coleções sejam manipuladas independentemente dos detalhes de sua implementação. Tais Interfaces são a base do Java Collections Framework. Como você pode ver na figura seguinte, as interfaces principais formam uma hierarquia.





Por exemplo, Set é um tipo de coleção, SortedSet é um tipo especial de Set e assim por diante.Temos que notar tambem, que a figura possui 2 hierarquias diferentes, ja que Map nao é de fato uma verdadeira Collection!



  • Set-uma coleção que não pode conter elementos duplicados. Este modelo de interface a abstração matemática definida são usados para representar conjuntos, tais como as cartas que compreendem uma mão de poker, os cursos que compõem a grade de um aluno, ou os processos em execução em uma máquina

  • List-uma coleção ordenada (algumas vezes chamado de seqüência). As listas podem conter elementos duplicados. O usuário de uma lista geral, tem um controle preciso sobre onde cada elemento é inserido na lista e pode acessar elementos pelo seu índice inteiro (posição). Se você já usou Vector, você está familiarizado com o sabor das listas em geral.

  • Queue-uma coleção usada para armazenar vários elementos, antes de serem processados, por exemplo. Além de operações básicas de Collection, uma fila provê operações especiais de uma fila como a inserção, extração e inspeção. As filas normalmente, mas não necessariamente, guardam seus elementos atraves da politica FIFO (first-in, first-out) As exceções são as filas de prioridade, onde os elementos sao ordenados de acordo com um comparador fornecido, ou sua "ordenação natural. Qualquer que seja a ordenação utilizada, o primeiro de fila é o elemento que ira ser removido por uma chamada paos metodos remove ou poll. Em uma fila FIFO, todos os novos elementos são inseridos na cauda da fila. Outros tipos de filas podem usar regras de posicionamento diferentes. Cada implementação da fila deve especificar as suas propriedades de ordenação.
  • Map-um objeto que mapeia chaves para valores. Um mapa não pode conter chaves duplicadas: cada chave pode mapear para, no máximo, um valor. Se você já usou Hashtable, você já está familiarizado com os princípios de um Mapa

Implementações




Existem três implementações de Set com proposito geral- HashSet, TreeSet, e LinkedHashSet. Para as três , a utilização é geralmente simples. HashSet é muito mais rápido do que TreeSet (constante de tempo em função de log-tempo para a maioria das operações), mas não oferece garantias de ordenação. Se você precisa usar as operações na interface SortedSet, ou se a ordenação dos elementos é necessária, use TreeSet caso contrário use HashSet . É uma aposta justa que você vai acabar usando HashSet na maior parte do tempo.


Existem duas implementações com finalidades gerais de List - ArrayList e LinkedList. Na maioria das vezes, você provavelmente vai usar ArrayList, que oferece tempo constante de acesso e de posicionamento sendo simplesmente rápido. Ele não tem que alocar um objeto nó para cada elemento da lista, e pode tirar vantagem de System.arraycopy quando tem que movimentar vários elementos ao mesmo tempo. Pense em ArrayList como um vetor sem a sobrecarga de sincronização.

Se você freqüentemente adiciona elementos no início da lista ou itera na lista para eliminar os elementos do seu interior, você deve considerar usar LinkedList. Essas operações exigem tempo constante em um LinkedList e tempo linear em um ArrayList. Mas você paga um preço grande no desempenho. Acesso posicional requer tempo linear em uma LinkedList e constante em um ArrayList. Além disso, o fator constante para LinkedList é muito pior. Se você acha que quer usar uma LinkedList, meça o desempenho de seu aplicativo tanto com LinkedList como com ArrayList antes de fazer sua escolha; ArrayList é geralmente bem mais rápido.

As implementações de finalidade geral de Map são HashMap, TreeMap e LinkedHashMap. Se você precisa de operações como as de SortedMap ou necessita de uma iteração Collection-view, utilize TreeMap , se você quiser velocidade máxima e não se preocupa com a ordem de iteração, HashMap é a sua escolha, se você quiser um desempenho próximo de HashMap e inserção-iteração com ordem, LinkedHashMap sera a escolha.

LinkedHashMap fornece duas capacidades que não estão disponíveis em um LinkedHashSet. Quando você cria um LinkedHashMap, você pode requisitá-lo com base na chave de acesso ao invés de inserção. Em outras palavras, apenas olhando para o valor associado com uma chave que traz a chave para o final do mapa. Além disso, LinkedHashMap fornece o método removeEldestEntry, que pode ser substituído para impor uma política de remoção de mapeamentos obsoletos automaticamente quando novos mapeamentos são adicionados ao mapa. Isto torna muito fácil de implementar um cache personalizado.



LinkedList implementa a interface Queue, fornecendo um fila FIFO com operações para adicionar, remover da fila e assim por diante.

A classe PriorityQueue é uma fila de prioridades com base na estrutura de dados Heap. Essa fila de elementos é ordenada de acordo com uma ordem especificada no momento da construção, que podem ser os elementos "naturais ordenação ou a ordem imposta por um comparador explícito.

Na fila existemas seguintes de operações de recuperação - poll, remove, peek, e element - para acessar o elemento na frente da fila. A cabeça da fila é o menor elemento que diz respeito à ordenação especificada. Se vários elementos estão ligados pelo valor, a cabeça é um desses elementos, os empates são resolvidos de forma arbitrária.

PriorityQueue e seu iterador implementam todos os métodos opcionais da coleção e Iterator interfaces. O iterador previsto no iterador método não é garantido para percorrer os elementos da PriorityQueue em qualquer ordem particular. Se você precisa de condenação na iteração, considere o uso Arrays.sort (pq.toArray ()).



O framework Collections do Java é um tema simples, porem extenso e existem ainda muito mais informações que eu gostaria de compartilhar , por isso não percam os proximos posts, mostrando como funcionam os algoritmos de ordenação, shuffle, e uma serie de algoritmos muito uteis para se trabalhar com coleções, alem de particularidades da API e como usar coleções concorrentes ou thread-safe e criaremos uma coleção Wrapper para uma matriz quadrada com operações basicas de algebra linear, como exemplo.Outro tema muito abordado em conjunto é Generics(Genericos) ao qual falarei tambem em uma outra oportunidade.


Referencias

Marcadores: , , , , ,

0 Comentários:

Postar um comentário

Assinar Postar comentários [Atom]

<< Página inicial