Pergunta

Como utilizar as hashtables?

Resposta

As hashtables constituem um mecanimos extremamente útil para o armazenamento organizado de dados.

Hastables funcionam através da associação de uma chave a um valor (função de mapeamento), ambos armazenado em memória. Ao invés de pesquisar-se todos os elementos armazenados em busca de um certo elemento, o uso das chaves permite o uso de um esquema de indexação rápida extremamente eficiente e que pode ser utilizado com vantagens em inúmeras situações.

O Java oferece a classe java.util.Hashtable onde tanto as chaves como os valores armazenados são do tipo Object, ou seja, podem ser qualquer outro tipo de objeto, tal como do tipo String ou Integer. (Dados de tipo primitivo não pode ser usados como chave nem armazenados diretamente, sendo necessário o uso de uma das classes wrapper oferecidas pelo Java).

A medida que objetos são inseridos na hashtable esta é automaticamente expandida caso necessário, eliminando a necessidade do programador de controlar seu tamanho, tal como nos objetos do tipo java.util.Vector (JavaFaq 0063).

Abaixo um exemplo, onde um valor inteiro é transformado um objeto Integer para seu uso como chave da hashtable.

// Instanciação de uma hastable 
Hashtable hash = new Hashtable();
// a variável i contêm um inteiro qualquer
// que será convertido como objeto Integer
// funcionando como uma chave
Integer chave = new Integer (i);

// Colocação do objeto data na hashtable
// associado a chave do tipo Integer através
// do método put
hash.put(chave, data);

// objetos são recuperado da hashtable através
// do método get
Object data = hash.get(chave);

Abaixo uma pequena demostração do uso de hashtables que adiciona uma centena de objetos String numa hashtable onde cada uma destas é indexada através de um inteiro convertido como exemplificado acima.

import java.util.*;

public class hash {

  public static void main (String args[]) throws Exception {
    // Inicia a hashtable com 10 elementos
    // expandindo-a de 10 em 10 elementos
    Hashtable hash = new Hashtable(10,10);

    for (int i = 0; i <= 100; i++)
    {
	Integer integer = new Integer ( i );
	hash.put( integer, "Number : " + i);
    }

    // Retirada de um elemento da hastable
    System.out.println (hash.get(new Integer((int)(Math.random()*100))));

    System.out.println("Pressione enter para prosseguir...");
    System.in.read();

    // Retirada de todos os valores
    for (Enumeration e = hash.keys(); e.hasMoreElements();)
    {
	System.out.println (hash.get(e.nextElement()));
    }
 }
}

Note que as hashtables não armazenam as chaves sequencialmente, assim não existe uma forma ordenação das chaves na lista de objetos armazenados.

Para obter todos os elementos de uma hashtable utiliza-se uma enumeração como na parte final do exemplo. Para maiores informações consulte as classes java.util.Hashtable e java.util.Enumeration na documentação fornecida juntamente com o JDK.