A classe Hashtable implementa uma tabela hash, que mapeia chaves para valores. Qualquer objeto não nulo pode ser usado como chave ou valor. Para armazenar e recuperar objetos de uma tabela de hash com êxito, os objetos usados ​​como chaves devem implementar o método hashCode e o método equals.  

Recursos do Hashtable

  • É semelhante ao HashMap, mas é sincronizado.
  • A tabela de hash armazena o par chave / valor na tabela de hash.
  • Em Hashtable, especificamos um objeto que é usado como uma chave e o valor que queremos associar a essa chave. A chave é então hash e o código hash resultante é usado como o índice no qual o valor é armazenado na tabela.
  • A capacidade padrão inicial da classe Hashtable é 11, enquanto loadFactor é 0,75.
  • HashMap não fornece qualquer Enumeração, enquanto Hashtable não fornece Enumeração rápida para falhas.

Declaração:

public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable

Parâmetros de tipo:

  • K - o tipo de chaves mantidas por este mapa
  • V - o tipo de valores mapeados

A hierarquia da tabela de hash

Hierarquia de Hashtable

 

Hashtable implementa interfaces Serializable , Cloneable , Map <K, V> e estende Dictionary <K, V> . As subclasses diretas são Propriedades , UIDefaults .
 

Construtores:

Para criar um Hashtable, precisamos importá-lo de java.util.Hashtable . Existem várias maneiras de criar um Hashtable.

1. Hashtable(): Isso cria uma hashtable vazia com o fator de carga padrão de 0,75 e uma capacidade inicial de 11. 

Hashtable <K, V> ht = nova Hashtable <K, V>();

// Java program to demonstrate
// adding elements to Hashtable
  
import java.io.*;
import java.util.*;
  
class AddElementsToHashtable {
    public static void main(String args[])
    {
        // No need to mention the
        // Generic type twice
        Hashtable<Integer, String> ht1 = new Hashtable<>();
  
        // Initialization of a Hashtable
        // using Generics
        Hashtable<Integer, String> ht2
            = new Hashtable<Integer, String>();
  
        // Inserting the Elements
        // using put() method
        ht1.put(1, "one");
        ht1.put(2, "two");
        ht1.put(3, "three");
  
        ht2.put(4, "four");
        ht2.put(5, "five");
        ht2.put(6, "six");
  
        // Print mappings to the console
        System.out.println("Mappings of ht1 : " + ht1);
        System.out.println("Mappings of ht2 : " + ht2);
    }
}
Saída
Mapeamentos de ht1: {3 = três, 2 = dois, 1 = um}
Mapeamentos de ht2: {6 = seis, 5 = cinco, 4 = quatro}

2. Hashtable (int initialCapacity): Isso cria uma tabela hash que tem um tamanho inicial especificado por initialCapacity e o fator de carga padrão é 0,75.

Hashtable <K, V> ht = nova Hashtable <K, V> (int initialCapacity);

// Java program to demonstrate
// adding elements to Hashtable
  
import java.io.*;
import java.util.*;
  
class AddElementsToHashtable {
    public static void main(String args[])
    {
        // No need to mention the
        // Generic type twice
        Hashtable<Integer, String> ht1 = new Hashtable<>(4);
  
        // Initialization of a Hashtable
        // using Generics
        Hashtable<Integer, String> ht2
            = new Hashtable<Integer, String>(2);
  
        // Inserting the Elements
        // using put() method
        ht1.put(1, "one");
        ht1.put(2, "two");
        ht1.put(3, "three");
  
        ht2.put(4, "four");
        ht2.put(5, "five");
        ht2.put(6, "six");
  
        // Print mappings to the console
        System.out.println("Mappings of ht1 : " + ht1);
        System.out.println("Mappings of ht2 : " + ht2);
    }
}
Saída

Mapeamentos de ht1: {3 = três, 2 = dois, 1 = um}
Mapeamentos de ht2: {4 = quatro, 6 = seis, 5 = cinco}

3. Hashtable (int size, float fillRatio): Esta versão cria uma tabela hash que tem um tamanho inicial especificado por tamanho e taxa de preenchimento especificada por fillRatio. taxa de preenchimento: Basicamente, ele determina o quão cheia uma tabela de hash pode ser antes de ser redimensionada para cima e seu valor ficar entre 0,0 e 1,0.

Hashtable <K, V> ht = new Hashtable <K, V> (tamanho interno, float fillRatio);

// Java program to demonstrate
// adding elements to Hashtable
  
import java.io.*;
import java.util.*;
  
class AddElementsToHashtable {
    public static void main(String args[])
    {
        // No need to mention the
        // Generic type twice
        Hashtable<Integer, String> ht1
            = new Hashtable<>(4, 0.75f);
  
        // Initialization of a Hashtable
        // using Generics
        Hashtable<Integer, String> ht2
            = new Hashtable<Integer, String>(3, 0.5f);
  
        // Inserting the Elements
        // using put() method
        ht1.put(1, "one");
        ht1.put(2, "two");
        ht1.put(3, "three");
  
        ht2.put(4, "four");
        ht2.put(5, "five");
        ht2.put(6, "six");
  
        // Print mappings to the console
        System.out.println("Mappings of ht1 : " + ht1);
        System.out.println("Mappings of ht2 : " + ht2);
    }
}
Saída
Mapeamentos de ht1: {3 = três, 2 = dois, 1 = um}
Mapeamentos de ht2: {6 = seis, 5 = cinco, 4 = quatro}

4. Tabela de hash (Map <? Extends K ,? extends V> m): Isso cria uma tabela de hash que é inicializada com os elementos em m.

Hashtable <K, V> ht = nova Hashtable <K, V> (Mapa m);

// Java program to demonstrate
// adding elements to Hashtable
  
import java.io.*;
import java.util.*;
  
class AddElementsToHashtable {
    public static void main(String args[])
    {
        // No need to mention the
        // Generic type twice
        Map<Integer, String> hm = new HashMap<>();
  
        // Inserting the Elements
        // using put() method
        hm.put(1, "one");
        hm.put(2, "two");
        hm.put(3, "three");
  
        // Initialization of a Hashtable
        // using Generics
        Hashtable<Integer, String> ht2
            = new Hashtable<Integer, String>(hm);
  
        // Print mappings to the console
  
        System.out.println("Mappings of ht2 : " + ht2);
    }
}
Saída
Mapeamentos de ht2: {3 = três, 2 = dois, 1 = um}

Exemplo:

// Java program to illustrate
// Java.util.Hashtable
  
import java.util.*;
  
public class GFG {
    public static void main(String[] args)
    {
        // Create an empty Hashtable
        Hashtable<String, Integer> ht = new Hashtable<>();
  
        // Add elements to the hashtable
        ht.put("vishal", 10);
        ht.put("sachin", 30);
        ht.put("vaibhav", 20);
  
        // Print size and content
        System.out.println("Size of map is:- " + ht.size());
        System.out.println(ht);
  
        // Check if a key is present and if
        // present, print value
        if (ht.containsKey("vishal")) {
            Integer a = ht.get("vishal");
            System.out.println("value for key"
                               + " \"vishal\" is:- " + a);
        }
    }
}

 
 

Saída
O tamanho do mapa é: - 3
{vaibhav = 20, vishal = 10, sachin = 30}
o valor da chave "vishal" é: - 10

Executando Várias Operações em Hashtable                  

1. Adicionando Elementos: Para adicionar um elemento à tabela de hash, podemos usar o método put() . No entanto, o pedido de inserção não é retido na tabela de hash. Internamente, para cada elemento, um hash separado é gerado e os elementos são indexados com base nesse hash para torná-lo mais eficiente.                      

// Java program to demonstrate
// adding elements to Hashtable
  
import java.io.*;
import java.util.*;
  
class AddElementsToHashtable {
    public static void main(String args[])
    {
        // No need to mention the
        // Generic type twice
        Hashtable<Integer, String> ht1 = new Hashtable<>();
  
        // Initialization of a Hashtable
        // using Generics
        Hashtable<Integer, String> ht2
            = new Hashtable<Integer, String>();
  
        // Inserting the Elements
          // using put() method
        ht1.put(1, "Geeks");
        ht1.put(2, "For");
        ht1.put(3, "Geeks");
  
        ht2.put(1, "Geeks");
        ht2.put(2, "For");
        ht2.put(3, "Geeks");
          
          // Print mappings to the console
        System.out.println("Mappings of ht1 : " + ht1);
        System.out.println("Mappings of ht2 : " + ht2);
    }
}
Saída
Mapeamentos de ht1: {3 = Geeks, 2 = For, 1 = Geeks}
Mapeamentos de ht2: {3 = Geeks, 2 = For, 1 = Geeks}

2. Alterando Elementos: Depois de adicionar os elementos, se desejarmos alterar o elemento, isso pode ser feito adicionando novamente o elemento com o método put() . Uma vez que os elementos na tabela de hash são indexados usando as chaves, o valor da chave pode ser alterado simplesmente inserindo o valor atualizado para a chave que desejamos alterar.

// Java program to demonstrate
// updating Hashtable
  
import java.io.*;
import java.util.*;
class UpdatesOnHashtable {
    public static void main(String args[])
    {
  
        // Initialization of a Hashtable
        Hashtable<Integer, String> ht
            = new Hashtable<Integer, String>();
  
        // Inserting the Elements
          // using put method
        ht.put(1, "Geeks");
        ht.put(2, "Geeks");
        ht.put(3, "Geeks");
          
          // print initial map to the console
        System.out.println("Initial Map " + ht);
          
          // Update the value at key 2
        ht.put(2, "For");
          
          // print the updated map
        System.out.println("Updated Map " + ht);
    }
}
Saída
Mapa inicial {3 = Geeks, 2 = Geeks, 1 = Geeks}
Mapa atualizado {3 = Geeks, 2 = For, 1 = Geeks}

3. Removendo Elemento: Para remover um elemento do Mapa, podemos usar o método remove() . Este método pega o valor da chave e remove o mapeamento de uma chave deste mapa, se estiver presente no mapa.

// Java program to demonstrate
// the removing mappings from Hashtable
  
import java.io.*;
import java.util.*;
class RemovingMappingsFromHashtable {
  
    public static void main(String args[])
    {
        // Initialization of a Hashtable
        Map<Integer, String> ht
            = new Hashtable<Integer, String>();
  
        // Inserting the Elements
          // using put method
        ht.put(1, "Geeks");
        ht.put(2, "For");
        ht.put(3, "Geeks");
        ht.put(4, "For");
  
        // Initial HashMap
        System.out.println("Initial map : " + ht);
  
          // Remove the map entry with key 4
        ht.remove(4);
  
        // Final Hashtable
        System.out.println("Updated map : " + ht);
    }
}
Saída
Mapa inicial: {4 = For, 3 = Geeks, 2 = For, 1 = Geeks}
Mapa atualizado: {3 = Geeks, 2 = For, 1 = Geeks}

4. Traversal de uma Hashtable: Para iterar a tabela, podemos fazer uso de um loop for avançado . Abaixo está o exemplo de iteração de uma tabela de hash.

// Java program to illustrate
// traversal of Hashtable
  
import java.util.Hashtable;
import java.util.Map;
  
public class IteratingHashtable {
    public static void main(String[] args)
    {
          // Create an instance of Hashtable
        Hashtable<String, Integer> ht = new Hashtable<>();
  
          // Adding elements using put method
        ht.put("vishal", 10);
        ht.put("sachin", 30);
        ht.put("vaibhav", 20);
      
          // Iterating using enhanced for loop
        for (Map.Entry<String, Integer> e : ht.entrySet())
            System.out.println(e.getKey() + " "
                               + e.getValue());
    }
}
Saída
vaibhav 20
Vishal 10
sachin 30

 Trabalho Interno de Hashtable

Estrutura de dados Hashtable é uma matriz de baldes que armazena os pares de chave / valor neles. Ele usa o método hashCode() para determinar qual intervalo o par chave / valor deve mapear.
A função hash ajuda a determinar a localização de uma determinada chave na lista de depósitos. Geralmente, hashcode é um número inteiro não negativo que é igual para Objetos iguais e pode ou não ser igual para Objetos desiguais. Para determinar se dois objetos são iguais ou não, hashtable usa o método equals().

É possível que dois Objetos desiguais tenham o mesmo código hash. Isso é chamado de colisão . Para resolver as colisões, o hashtable usa uma série de listas. Os pares mapeados para um único depósito (índice de matriz) são armazenados em uma lista e a referência de lista é armazenada no índice de matriz.

Colisão de hashtable

Métodos de Hashtable

  • K - o tipo das chaves no mapa.
  • V - Tipo de valores mapeados no mapa.

MÉTODO

DESCRIÇÃO

Claro()Limpa esta tabela de hash para que não contenha chaves.
clone()Cria uma cópia superficial desta tabela de hash.

compute (tecla K, BiFunction <? super 

K ,? super V ,? estende V> remappingFunction)

Tenta calcular um mapeamento para a chave especificada e seu valor mapeado atual (ou nulo se não houver mapeamento atual).

computeIfAbsent (tecla K, Função <? super K ,? 

estende V> mappingFunction)

Se a chave especificada ainda não estiver associada a um valor (ou estiver mapeada para nulo), tenta calcular seu valor usando a função de mapeamento fornecida e o insere neste mapa, a menos que seja nulo.
computeIfPresent (K key, BiFunction <? super K ,? super V ,? extends V> remappingFunction)Se o valor da chave especificada estiver presente e não for nulo, tenta calcular um novo mapeamento, dada a chave e seu valor mapeado atual.
contém (valor do objeto)Testa se alguma chave é mapeada para o valor especificado nesta tabela de hash.
containsKey (chave do objeto)Testa se o objeto especificado é uma chave nesta tabela de hash.
containsValue (valor do objeto)Retorna verdadeiro se esta tabela de hash mapeia uma ou mais chaves para este valor.
elementos()Retorna uma enumeração dos valores nesta tabela de hash.
entrySet()Retorna uma visualização Set dos mapeamentos contidos neste mapa.
é igual a (objeto o)Compara o objeto especificado com este mapa para igualdade, de acordo com a definição na interface do mapa.
get (chave do objeto)Retorna o valor para o qual a chave especificada é mapeada ou nulo se este mapa não contém mapeamento para a chave.
hashCode()Retorna o valor do código hash para este mapa de acordo com a definição na interface do mapa.
 está vazia()Testa se esta tabela de hash não mapeia chaves para valores.
chaves()Retorna uma enumeração das chaves nesta tabela de hash.
conjunto de chaves()Retorna uma visualização Set das chaves contidas neste mapa.
mesclar (tecla K, valor V, BiFunção <? super V ,? super V ,? estende V> função remapeamento)Se a chave especificada ainda não estiver associada a um valor ou estiver associada a nulo, associa-a ao valor não nulo fornecido.
 colocar (chave K, valor V)Mapeia a chave especificada para o valor especificado nesta tabela de hash.
 putAll (Map <? estende K ,? estende V> t)Copia todos os mapeamentos do mapa especificado para esta tabela de hash.
rehash()Aumenta a capacidade e reorganiza internamente esta hashtable, para acomodar e acessar suas entradas de forma mais eficiente.
remover (chave do objeto)Remove a chave (e seu valor correspondente) desta tabela de hash.
Tamanho()Retorna o número de chaves nesta tabela de hash.
 para sequenciar()Retorna uma representação de string deste objeto Hashtable na forma de um conjunto de entradas, entre colchetes e separados pelos caracteres ASCII “,” (vírgula e espaço).
 valores()Retorna uma visualização de Coleção dos valores contidos neste mapa.

Métodos declarados na interface java.util.Map

MÉTODO

DESCRIÇÃO

 forEach (ação BiConsumer <? super K ,? super V>)Executa a ação fornecida para cada entrada neste mapa até que todas as entradas tenham sido processadas ou a ação lance uma exceção.
getOrDefault (chave do objeto, V defaultValue)Retorna o valor para o qual a chave especificada é mapeada ou defaultValue se este mapa não contiver mapeamento para a chave.
putIfAbsent (chave K, valor V)Se a chave especificada ainda não estiver associada a um valor (ou estiver mapeada para nulo), a associa ao valor fornecido e retorna nulo, caso contrário, retorna o valor atual.

remove (chave do objeto,

                     Valor do objeto)

Remove a entrada para a chave especificada apenas se ela estiver atualmente mapeada para o valor especificado.
substituir (chave K, valor V)Substitui a entrada da chave especificada apenas se ela estiver mapeada para algum valor.
substituir (chave K, V antigoValor, V novoValor)Substitui a entrada da chave especificada apenas se atualmente mapeada para o valor especificado.
substituirAll (BiFunction <? super K ,? super V ,? extends V> função)Substitui o valor de cada entrada com o resultado de invocar a função fornecida nessa entrada até que todas as entradas tenham sido processadas ou a função lance uma exceção.

Deve ler:

Referência: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Hashtable.html