usar - map java




Diferenças entre HashMap e Hashtable? (20)

Além de todos os outros aspectos importantes já mencionados aqui, a API Collections (por exemplo, interface de mapa) está sendo modificada o tempo todo para se adequar às adições "mais recentes e maiores" às especificações de Java.

Por exemplo, compare a iteração do Java 5 Map:

for (Elem elem : map.keys()) {
  elem.doSth();
}

versus a antiga abordagem Hashtable:

for (Enumeration en = htable.keys(); en.hasMoreElements(); ) {
  Elem elem = (Elem) en.nextElement();
  elem.doSth();
}

No Java 1.8, também estamos prometidos para poder construir e acessar o HashMaps como nas boas e antigas linguagens de script:

Map<String,Integer> map = { "orange" : 12, "apples" : 15 };
map["apples"];

Atualização: Não, eles não vão pousar em 1,8 ... :(

Os aprimoramentos da coleção do Project Coin serão no JDK8?

Quais são as diferenças entre um HashMap e uma Hashtable em Java?

Qual é mais eficiente para aplicativos não encadeados?


Além do que izb disse, o HashMap permite valores nulos, enquanto o Hashtable não.

Observe também que Hashtable estende a classe Dictionary , que, como o estado Javadocs , é obsoleta e foi substituída pela interface Map .


Dê uma olhada neste gráfico. Ele fornece comparações entre diferentes estruturas de dados, juntamente com o HashMap e o Hashtable. A comparação é precisa, clara e fácil de entender.

Matriz de Coleção Java


Essa pergunta é frequentemente feita em entrevistas para verificar se o candidato compreende o uso correto das aulas de coleta e está ciente das soluções alternativas disponíveis.

  1. A classe HashMap é aproximadamente equivalente a Hashtable, exceto que não é sincronizada e permite valores nulos. (HashMap permite valores nulos como chave e valor, enquanto Hashtable não permite nulos).
  2. O HashMap não garante que a ordem do mapa permaneça constante ao longo do tempo.
  3. O HashMap não é sincronizado, enquanto o Hashtable é sincronizado.
  4. Iterator no HashMap é à prova de falhas enquanto o enumerador da Hashtable não está e lança ConcurrentModificationException se qualquer outro Thread modifica estruturalmente o mapa adicionando ou removendo qualquer elemento exceto o próprio método remove () do Iterador. Mas isso não é um comportamento garantido e será feito pela JVM no melhor esforço.

Nota sobre alguns termos importantes

  1. Sincronizado significa que apenas um thread pode modificar uma tabela de hash em um determinado momento. Basicamente, isso significa que qualquer thread antes de executar uma atualização em um hashtable terá que adquirir um bloqueio no objeto enquanto outros aguardarão o bloqueio ser liberado.
  2. Fail-safe é relevante a partir do contexto de iteradores. Se um iterador tiver sido criado em um objeto de coleção e algum outro thread tentar modificar o objeto de coleção "estruturalmente", uma exceção de modificação simultânea será lançada. É possível que outros threads invoquem o método "set", já que ele não modifica a coleção "estruturalmente". No entanto, se antes de chamar "set", a coleção foi modificada estruturalmente, "IllegalArgumentException" será lançada.
  3. Estruturalmente, modificar significa excluir ou inserir elementos que poderiam efetivamente alterar a estrutura do mapa.

HashMap pode ser sincronizado por

Map m = Collections.synchronizeMap(hashMap);

O mapa fornece visualizações de coleção em vez de suporte direto para iteração por meio de objetos de enumeração. As visualizações de coleção aumentam muito a expressividade da interface, conforme discutido mais adiante nesta seção. Mapa permite que você faça iterações sobre chaves, valores ou pares de valores-chave; Hashtable não fornece a terceira opção. O mapa fornece uma maneira segura de remover entradas no meio da iteração; Hashtable não. Finalmente, o Map corrige uma pequena deficiência na interface Hashtable. Hashtable possui um método chamado contains, que retorna true se a Hashtable contiver um determinado valor. Dado seu nome, você esperaria que este método retornasse true se a Hashtable continha uma dada chave, porque a chave é o mecanismo de acesso primário para uma Hashtable. A interface Map elimina essa fonte de confusão, renomeando o método containsValue. Além disso, isso melhora a consistência da interface - containsValue parallels containsKey.

A interface do mapa


Há muitas boas respostas já postadas. Estou adicionando alguns novos pontos e resumindo isso.

HashMap e Hashtable são usados ​​para armazenar dados no formato de chave e valor . Ambos estão usando a técnica de hashing para armazenar chaves exclusivas. Mas existem muitas diferenças entre as classes HashMap e Hashtable que são dadas abaixo.

HashMap

  1. HashMap não é sincronizado. Não é thread-safe e não pode ser compartilhado entre muitos threads sem o código de sincronização adequado.
  2. HashMap permite uma chave nula e vários valores nulos.
  3. HashMap é uma nova classe introduzida no JDK 1.2.
  4. HashMap é rápido.
  5. Nós podemos fazer o HashMap como sincronizado chamando este código
    Map m = Collections.synchronizedMap(HashMap);
  6. HashMap é percorrido pelo Iterator.
  7. Iterator no HashMap é fail-fast.
  8. HashMap herda a classe AbstractMap.

Hashtable

  1. Hashtable é sincronizado. É thread-safe e pode ser compartilhado com muitos segmentos.
  2. Hashtable não permite nenhuma chave ou valor nulo.
  3. Hashtable é uma classe legada.
  4. Hashtable é lento.
  5. Hashtable é sincronizada internamente e não pode ser desassociada.
  6. Hashtable é percorrido pelo enumerador e Iterator.
  7. O enumerador na Hashtable não é fail-fast.
  8. Hashtable herda classe Dictionary.

Leitura adicional Qual é a diferença entre HashMap e Hashtable em Java?


Hashtable é sincronizado, enquanto HashMap não é. Isso torna o Hashtable mais lento que o Hashmap.

Para aplicativos não segmentados, use o HashMap, pois eles são os mesmos em termos de funcionalidade.


Outra diferença chave entre hashtable e hashmap é que Iterator no HashMap é fail-rápido enquanto o enumerador para a Hashtable não está e lança ConcurrentModificationException se qualquer outro Thread modifica estruturalmente o mapa adicionando ou removendo qualquer elemento exceto o método remove () do Iterator. Mas isso não é um comportamento garantido e será feito pela JVM no melhor esforço ".

Minha fonte: http://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.html


Tenha em mente que o HashTable era uma classe legada antes do Java Collections Framework (JCF) ser introduzido e posteriormente adaptado para implementar a interface Map . Então foi Vector e Stack .

Portanto, fique sempre longe deles em código novo, já que há sempre uma alternativa melhor no JCF, como outros apontaram.

Aqui está a folha de dicas da coleção Java que você achará útil. Observe que o bloco cinza contém a classe herdada HashTable, Vector e Stack.


HashMap : Uma implementação da interface Map que usa códigos hash para indexar uma matriz. Hashtable : Oi, 1998 chamado. Eles querem sua API de coleções de volta.

Falando sério, é melhor você ficar longe da Hashtable . Para aplicativos de segmentação única, você não precisa da sobrecarga extra de sincronização. Para aplicativos altamente simultâneos, a sincronização paranóica pode levar a inanição, impasses ou pausas desnecessárias na coleta de lixo. Como Tim Howland apontou, você pode usar ConcurrentHashMap .


HashMap e o Hashtable possuem diferenças algorítmicas significativas. Ninguém mencionou isso antes, então é por isso que estou falando sobre isso. HashMap irá construir uma tabela de hash com potência de dois tamanhos, aumentá-lo dinamicamente de forma que você tenha no máximo cerca de oito elementos (colisões) em qualquer bucket e agite os elementos muito bem para os tipos de elementos gerais. No entanto, a implementação do Hashtable fornece melhor controle sobre o hashing se você sabe o que está fazendo, ou seja, você pode corrigir o tamanho da tabela usando o número primo mais próximo ao tamanho do seu domínio de valores e isso resultará em melhor desempenho do que o HashMap. colisões para alguns casos.

Separado das diferenças óbvias discutidas extensivamente nesta questão, eu vejo o Hashtable como um carro de "movimentação manual" onde você tem melhor controle sobre o hashing e o HashMap como a contraparte de "drive automático" que geralmente terá um bom desempenho.


Hashtable é considerado código legado. Não há nada sobre o Hashtable que não possa ser feito usando o HashMap ou derivações do HashMap , portanto, para o novo código, não vejo nenhuma justificativa para voltar ao Hashtable .


Hashtable é semelhante ao HashMap e tem uma interface semelhante. É recomendável usar o HashMap , a menos que você precise de suporte para aplicativos legados ou precise de sincronização, pois os métodos do Hashtables são sincronizados. Então, no seu caso, como você não é multi-threading, HashMaps são a sua melhor aposta.


Hashtable:

Hashtable é uma estrutura de dados que retém valores de pares de valores-chave. Não permite nulo para as chaves e os valores. Você receberá um NullPointerExceptionse você adicionar um valor nulo. Está sincronizado. Então vem com seu custo. Apenas um thread pode acessar o HashTable em um determinado momento.

Exemplo :

import java.util.Map;
import java.util.Hashtable;

public class TestClass {

    public static void main(String args[ ]) {
    Map<Integer,String> states= new Hashtable<Integer,String>();
    states.put(1, "INDIA");
    states.put(2, "USA");

    states.put(3, null);    //will throw NullPointerEcxeption at runtime

    System.out.println(states.get(1));
    System.out.println(states.get(2));
//  System.out.println(states.get(3));

    }
}

HashMap:

O HashMap é como Hashtable, mas também aceita pares de valores-chave. Permite nulo para as chaves e os valores. Seu desempenho melhor é melhor que HashTable, porque é unsynchronized.

Exemplo:

import java.util.HashMap;
import java.util.Map;

public class TestClass {

    public static void main(String args[ ]) {
    Map<Integer,String> states = new HashMap<Integer,String>();
    states.put(1, "INDIA");
    states.put(2, "USA");

    states.put(3, null);    // Okay
    states.put(null,"UK");

    System.out.println(states.get(1));
    System.out.println(states.get(2));
    System.out.println(states.get(3));

    }
}

HashMap e HashTable

  • Alguns pontos importantes sobre HashMap e HashTable. por favor leia abaixo detalhes.

1) Hashtable e Hashmap implementam a interface java.util.Map 2) Hashmap e Hashtable são a coleção baseada em hash. e trabalhando em hashing. então, essas são semelhanças entre HashMap e HashTable.

  • Qual é a diferença entre HashMap e HashTable?

1) A primeira diferença é que o HashMap não é seguro para threads Embora o HashTable seja o ThreadSafe
2) O HashMap é melhor para o desempenho porque não é seguro para threads. enquanto o desempenho do Hashtable não é melhor porque é thread-safe. então múltiplos segmentos não podem acessar o Hashtable ao mesmo tempo.


Existem 5 diferenciações básicas com HashTable e HashMaps.

  1. O Maps permite que você repita e recupere chaves, valores e ambos os pares de valores-chave, onde o HashTable não tem toda essa capacidade.
  2. Na Hashtable há uma função contains (), que é muito confusa de usar. Porque o significado de contém é ligeiramente divergente. Quer isso signifique contém chave ou contém valor? difícil de entender. A mesma coisa no Maps, temos as funções ContainsKey () e ContainsValue (), que são muito fáceis de entender.
  3. No hashmap você pode remover o elemento enquanto iterar, com segurança. onde, como não é possível em hashtables.
  4. HashTables são sincronizadas por padrão, portanto, podem ser usadas com vários threads facilmente. Onde os HashMaps não são sincronizados por padrão, podem ser usados ​​apenas com um único encadeamento. Mas você ainda pode converter o HashMap para sincronizar usando a função synchronizedMap (Map m) da classe util do Collections.
  5. HashTable não permitirá chaves nulas ou valores nulos. Onde como HashMap permite uma chave nula e vários valores nulos.

HashMap: - É uma classe disponível dentro do pacote java.util e é usada para armazenar o elemento no formato chave e valor.

Hashtable: -É uma classe legada que está sendo reconhecida dentro da estrutura de coleta


Minha pequena contribuição:

  1. Primeiro e mais significativo diferente entre Hashtablee HashMapé isso, HashMapnão é thread-safe enquanto Hashtableé uma coleção thread-safe.

  2. Segunda diferença importante entre Hashtablee HashMapé o desempenho, já que HashMapnão está sincronizado, ele é melhor que Hashtable.

  3. Terceira diferença no Hashtablevs HashMapé que Hashtableé classe obsoleta e você deve estar usando ConcurrentHashMapno lugar de HashtableJava.


Para aplicativos encadeados, muitas vezes você pode se safar com o ConcurrentHashMap - depende dos seus requisitos de desempenho.


1. Hashmape HashTableambos armazenam chave e valor.

2. Hashmappode armazenar uma chave como null. Hashtablenão pode armazenar null.

3. HashMapnão está sincronizado, mas Hashtableestá sincronizado.

4. HashMappode ser sincronizado comCollection.SyncronizedMap(map)

Map hashmap = new HashMap();

Map map = Collections.SyncronizedMap(hashmap);

Além das diferenças já mencionadas, deve-se notar que, desde o Java 8, HashMapsubstitui dinamicamente os Nodes (lista vinculada) usados ​​em cada bucket com TreeNodes (árvore vermelha-preta), de forma que mesmo se houver colisões hash altas, o pior caso quando pesquisar é

O (log (n)) para HashMap Vs O (n) em Hashtable.

* A melhoria acima mencionada não tenha sido aplicado a Hashtableainda, mas apenas para HashMap, LinkedHashMape ConcurrentHashMap.

FYI, atualmente,

  • TREEIFY_THRESHOLD = 8 : se um bucket contiver mais de 8 nós, a lista vinculada será transformada em uma árvore balanceada.
  • UNTREEIFY_THRESHOLD = 6 : quando um balde fica muito pequeno (devido a remoção ou redimensionamento), a árvore é convertida de volta para a lista vinculada.




hashtable