Você está na página 1de 2

Quando um programador comea a utilizar a linguagem de programao Java, ele encontra um grande dilema que seria a possibilidade de usar

Collections no lugar de Arrays. Esse processo um grande passo, uma vez que se perde todo aquele conceito referencial e de controle existente no Array, como ordenao e manipulao de ndices tanto na insero, modificao e excluso por meio de variveis de controle, e tambm a perda de alguns mtodos utilizados com Arraylist, por exemplo, o get(int) que no encontrado em Collections, contudo na verdade o uso de collections nada mais que um armazenamento de uma coleo de referencias de objetos de modo aleatrio sem preocupaes maiores com ordenao ou de manter controle sobre como percorrer todo o conjunto, o que se pode entender como ponto negativo em se usar collection, pois alm de necessrio o uso de um set que use tabela de espalhamento ( Hashset), necessrio tambm o uso de uma instancia de Hashmap como apoio, sendo o mesmo responsvel por associar chaves e valores e depois recuper-los atravs das chaves, semelhante a tabela hash. Com isso o gasto de memria maior do que o um simples Array que armazenaria apenas o valor e uma referencia ao mesmo quanto posio. A grande vantagem do Hashset seria em termos de velocidade quanto a se realizar buscas na coleo, sendo que em um Array seria efetuada uma busca por todas as posies, independente de qual algoritmo fosse usado, mas como o Hashset implementado como uma tabela, criada uma matriz na qual os elementos so armazenados em uma posio derivada de seu contedo, onde o mesmo utilizado para recuperar esses elementos, ou seja, baseado no contedo da consulta e no Hashcode o objeto retornado. Esta classe oferece performance de tempo constante para as operaes bsicas (add, remove, contains e size), desde que a funo hash disperse os elementos apropriadamente entre os buckets. A iterao pelos elementos requer um tempo proporcional soma do tamanho do HashSet (quantidade de elementos) mais a capacidade da instncia HashMap de apoio (nmero de buckets). Assim, importante no definir a capacidade inicial muito alta se a performance de iterao for importante. No cdigo abaixo so inseridas 30 mil referncias a objetos do tipo Integer em uma ArrayList, e depois realizada uma busca por cada um deles com o retorno do tempo gasto. public class TestaCollections { public static void main(String[] args) { Collection<Integer> colecao = new ArrayList<Integer>();

long tempoInicial = System.currentTimeMillis(); for (int i = 0; i < 30000; i++) { colecao.add(i); } for (int i = 0; i < 30000; i++) { colecao.contains(i); } long tempoFinal = System.currentTimeMillis(); System.out.printf("%.3f segundos%n", (tempoFinal - tempoInicial) / 1000d); } } O resultado: 8,891 segundos. Agora o mesmo teste com uma estrutura que o HashSet. Mudando a seguinte linha: Collection<Integer> colecao = new ArrayList<Integer>(); Para: Collection<Integer> colecao = new HashSet<Integer>();

O novo resultado 0,078 segundos, sendo 114 vezes mais rpido. Outra grande vantagem em se usar Hashset a de manipulao do tamanho da coleo de objetos, o que impraticvel quando se trabalha com Arrays, pois o tamanho definido na sua criao e no possvel a alterao de tamanho sendo necessria a criao de um array maior e a copia de todos os elementos do antigo para o novo.

Você também pode gostar