CodeGym /Blogue Java /Random-PT /Hashtable Java
John Squirrels
Nível 41
San Francisco

Hashtable Java

Publicado no grupo Random-PT
A classe Java Hashtable é um dos membros mais antigos do Java Collection Framework. É uma implementação da estrutura de dados da tabela hash matemática. Em Java, hashtable contém internamente depósitos onde os pares de chave/valor são armazenados. Hashtable é bem parecido com HashMap . A diferença mais significativa entre eles: Hashtable é sincronizado enquanto HashMap não é.

Hashtable como uma estrutura de dados

Hashtable é uma estrutura de dados onde os dados são armazenados em um formato de array. Cada valor de dados tem um valor de chave exclusivo. Se a chave for conhecida, o acesso aos dados necessários é muito rápido. Assim, as operações de inserção e pesquisa são rápidas independentemente do tamanho dos dados. Hash Table consiste em um array para manter os dados e hashing para geração de um índice onde um elemento deve estar localizado. O que é hash? É uma regra que mapeia o Objeto em um conjunto de caracteres (código). Normalmente, esse tipo de função converte um grande pedaço de dados em um pequeno valor inteiro. As funções de hash podem ser diferentes, mas todas apresentam certas propriedades:
  • Um objeto específico tem o código hash específico.
  • Dois objetos iguais têm os mesmos códigos hash. O contrário não é verdade.
  • Se dois códigos hash forem diferentes, os objetos definitivamente não são iguais.
  • Objetos diferentes podem ter o mesmo código hash. Este evento muito raro chama colisão. A boa função hash minimiza a probabilidade de colisões.
O resultado da aplicação da função Hash a um objeto chama hashCode .

Hashtable em Java

A classe Hashtable é a implementação de uma estrutura de dados de tabela hash. Essa coleção foi criada antes do Java Collection Framework, mas posteriormente incluída nela. Como todas as coleções “anteriores” (do Java 1.0), uma hashtable é sincronizada (quase todos os métodos são marcados como sincronizados). Devido a esse fator, hashtable tem problemas de desempenho significativos. Assim, a partir do Java 1.2, na maioria dos casos é recomendado o uso de outras implementações da interface Map devido à sua falta de sincronização. Normalmente HashMap é o substituto mais apropriado. Então Classe Hashtable<K,V>consiste em chaves e valores. Ele armazena chaves no princípio de hashing. Os pares chave-valor são armazenados em "buckets". Os baldes juntos constroem uma "tabela", uma espécie de array interno. Hashtable usa o hashcode da chave para determinar um bucket onde o par chave/valor deve ser mapeado. A função Hash permite obter a localização do balde a partir do hashcode de Key. Esta função retorna um número inteiro para um objeto. Como dissemos acima, dois objetos iguais têm o mesmo hashcode, enquanto dois objetos desiguais podem nem sempre ter diferentes hashcodes. Objetos diferentes, colocados em uma tabela hash, podem ter o mesmo código hash. Para resolver este problema (colisão), um array de listas é usado em hashtable. Os pares mapeados para um único balde são armazenados em uma lista e essa referência de lista é armazenada no índice da matriz.

Construtores Java Hashtable

  • Hashtable() , o construtor padrão. Ele cria uma tabela de hash vazia. (Capacidade inicial padrão = 11, fator de carga = 0,75).
  • Hashtable(int size) constrói uma hashtable de tamanho especificado.
  • Hashtable(int size, float fillRatio) cria uma tabela hash de tamanho e taxa de preenchimento especificados.
  • Hashtable(Map m) cria uma hashtable com os mesmos mapeamentos que o Map fornecido.

Declaração Hashtable

A classe Java Hashtable implementa as interfaces Map , Cloneable e Serializable . Estende a classe Dictionary .

Hashtable.java
public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable
K é o tipo de chaves mantidas pelo mapa. V é o tipo de valores mapeados. Exemplo:

Hashtable<Student, Integer> myHTable = new Hashtable<>();

Como importar hashtable java

Java Hashtable está dentro do pacote java.util . Portanto, use import java.util.Hashtable; em seu código. Normalmente, você receberá uma dica do seu IDE sobre isso.

Operações principais da tabela de hash

As principais operações do Hashtable são obter, inserir na coleção e remover de lá. Aqui, essas três operações são:
  • Object get(Object key) retorna o valor do Object que especificou a chave. Retorna nulo se essa chave não for encontrada.
  • Object put(Object key, Object value) mapeia a chave especificada para o valor especificado. Nem a chave nem o valor podem ser nulos.
  • Object remove(Object key) remove a entrada (chave e valor correspondente) da tabela de hash.
As outras operações importantes:
  • int size() retorna a quantidade de entradas na tabela hash.
  • boolean contains(Object value) verifica se o valor especificado está na tabela de hash. Nesse caso, o método retorna verdadeiro, caso contrário, retorna falso.
  • boolean containsValue(Object value) verifica se o valor especificado está na tabela de hash. Nesse caso, o método retorna verdadeiro, caso contrário, retorna falso.
  • void clear() remove todas as entradas da hashtable.
  • boolean containsKey(Object key) retorna true se a chave especificada existir na tabela de hash, senão retorna false.
  • boolean isEmpty() retorna true se a hashtable estiver vazia ou false se contiver pelo menos uma chave.
  • void rehash() aumenta o tamanho da hashtable e repete todas as suas chaves.

Implementação da tabela hash, código Java:

Vamos criar uma classe Aluno :

import java.util.Date;
public class Student {
   String surname;
   String name;
   String secondName;
   Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases

   public Student(String surname, String name, String secondName, Date birthday ){
       this.surname = surname;
       this.name = name;
       this.secondName = secondName;
       this.birthday = birthday == null ? 0 : birthday.getTime();
   }

   @Override
   public int hashCode(){
       //TODO: check for nulls
       return (surname + name + secondName + birthday).hashCode();
   }
   @Override
   public boolean equals(Object other_) {
       Student other = (Student)other_;
       return (surname == null || surname.equals(other.surname) )
               && (name == null || name.equals(other.name))
               && (secondName == null || secondName.equals(other.secondName))
               && (birthday == null || birthday.equals(other.birthday));
   }
}
Aqui está o exemplo Java Hashtable . Vamos colocar dois objetos da classe Student em hashtable, remover alguns e verificar alguns parâmetros.

public class HashTableExample {
   public static void main(String[] args) {
 
       Hashtable<Student, Integer> myHTable = new Hashtable<>();
       Student sarah1 = new Student("Sarah","Connor", "Jane", null);
       Student john = new Student("John","Connor", "Kyle", new Date(1985, 02-1, 28)); // date not exists
       myHTable.put(john,1);
       myHTable.put(sarah1,0);
       System.out.println(myHTable.get(john));
       System.out.println(myHTable.isEmpty());
       System.out.println(myHTable.size());
       System.out.println(myHTable.contains(1));
       myHTable.remove(john);
       System.out.println(myHTable.contains(0));
       System.out.println(myHTable.contains(1));
       System.out.println(myHTable.containsKey(sarah1));
   }
}
O resultado da execução do programa é:

1
false
2
true
true
false
true

HashMap vs Hashtable

  • Hashtable é semelhante ao HashMap em Java. A diferença mais significativa é que o Hashtable é sincronizado, enquanto o HashMap não é. Portanto, Hashtable é mais lento que HashMap devido à sincronização.
  • Exceto pelo problema de sincronização, o Hashtable não permite que null seja usado como um valor ou chave. HashMap permite uma chave nula e vários valores nulos.
  • Hashtable herda a classe Dictionary enquanto HashMap herda a classe AbstractMap.
  • HashMap é percorrido por Iterator. Hashtable pode ser percorrido não apenas pelo Iterator, mas também pelo Enumerator.

Exemplo de hashtable Java (chave nula Hashtable vs HashMap)

Aqui está um código de fragmento para demonstrar um nulo usado como chave e valor em HashMap e Hashtable

// Null key Java hashtable example and hashmap example  

try{
      System.out.println("Hashtable");
      Hashtable hashTable = new Hashtable();
      hashTable.put(null, new Object());
    }catch(Exception ex){
      ex.printStackTrace();
    }
    System.out.println("HashMap");
    HashMap hashMap = new HashMap();
    hashMap.put(null, new Object());
    System.out.println("as you see no exceptions with null key in HashMap");
  }
O resultado da execução do programa que contém este fragmento:

java.lang.NullPointerException
	at java.base/java.util.Hashtable.put(Hashtable.java:480)
	at Character.main(Character.java:58)
HashMap
as you see no exceptions with null key in HashMap

Conclusão

Você não costuma usar o Hashtable em projetos reais, mas é fácil encontrar essa estrutura de dados em projetos antigos. De qualquer forma, é importante entender o que as Estruturas de Dados Java tem e como elas funcionam, pelo menos para suas entrevistas. Normalmente objetos HashMap são usados ​​ao invés de Hashtable por causa de sua similaridade. HashMap é mais eficaz (não é sincronizado) e pode ter null como chave.
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION