Classe hashtable
Hashtable herda a interface Map e implementa uma tabela hash de mapeamento de valores-chave. Qualquer objeto não nulo pode ser usado como chave ou valor.
Para adicionar dados, use put(key,value) e para remover dados, use get(key). O custo de tempo dessas duas operações básicas é constante.
Hashtable ajusta o desempenho por meio de dois parâmetros: capacidade inicial e fator de carga. Normalmente, o fator de carga padrão 0,75 atinge um melhor equilíbrio entre tempo e espaço. Aumentar o fator de carga pode economizar espaço, mas o tempo de pesquisa correspondente aumentará, o que afetará operações como obter e colocar.
Um exemplo simples de uso de Hashtable é o seguinte. Coloque 1, 2 e 3 no Hashtable e suas chaves são "um", "dois" e "três", respectivamente:
Números da tabela hash = new Hashtable();
números.put(“um”, novo Inteiro(1));
números.put(“dois”, new Integer(2));
numbers.put(“três”, new Integer(3));
Para recuperar um número, como 2, use a chave correspondente:
Inteiro n = (Inteiro)números.get(“dois”);
System.out.println(“dois = ” + n);
Como o objeto usado como chave determinará a posição do valor correspondente calculando sua função hash, qualquer objeto usado como chave deve implementar os métodos hashCode e equals. Os métodos hashCode e equals são herdados da classe raiz Object. Se você usar uma classe customizada como chave, tome muito cuidado de acordo com a definição da função hash, se os dois objetos forem iguais, ou seja, obj1.equals(. obj2)=true, então seu hashCode deve ser O mesmo, mas se dois objetos forem diferentes, seu hashCode não será necessariamente diferente. Se o hashCode de dois objetos diferentes for o mesmo, esse fenômeno é chamado de conflito. O conflito aumentará o custo de tempo de operação da tabela hash. para defini-lo bem. O método hashCode() pode acelerar as operações da tabela hash.
Se o mesmo objeto tiver hashCode diferente, a operação da tabela hash terá resultados inesperados (o método get esperado retorna nulo). Para evitar esse problema, você só precisa se lembrar de uma coisa: substituir o método equals e o método hashCode ao mesmo tempo. vez. Não escreva apenas um deles. Hashtable é síncrono.
Classe HashMap
HashMap é semelhante ao Hashtable, exceto que HashMap é assíncrono e permite nulo, ou seja, valor nulo e chave nula. , mas ao tratar HashMap como uma Coleção (o métodovalues() pode retornar uma Coleção), o tempo gasto de suas suboperações de iteração é proporcional à capacidade do HashMap. Portanto, se o desempenho das operações iterativas for muito importante, não defina a capacidade inicial do HashMap muito alta ou o fator de carga muito baixo.
Classe WeakHashMap
WeakHashMap é um HashMap aprimorado que implementa "referências fracas" para chaves. Se uma chave não for mais referenciada externamente, a chave poderá ser reciclada pelo GC.
HashSet consulte a descrição do Set
Set é uma coleção que não contém elementos duplicados, ou seja, quaisquer dois elementos e1 e e2 possuem e1.equals(e2)=false, e Set possui no máximo um elemento nulo.
O construtor do conjunto tem uma restrição de que o parâmetro Collection passado não pode conter elementos duplicados.
Observação: objetos mutáveis devem ser manuseados com cuidado. Se um elemento mutável em um Set mudar seu estado causando Object.equals(Object)=true, isso causará alguns problemas.
Duas implementações comuns de Set são HashSet e TreeSet. Decidir qual usar é bastante simples. HashSet é muito mais rápido (tempo constante versus tempo de log para a maioria das operações), mas não fornece garantias de pedido. Se você precisar usar as operações em um SortedSet ou se a iteração sequencial for importante para você, use um TreeSet. Caso contrário, use um HashSet. É uma aposta justa você não usar um HashSet na maioria das vezes.
Uma coisa que você deve ter em mente sobre HashSets é que a iteração é linear em termos da soma do número de entradas e da capacidade. Portanto, se o desempenho da iteração for importante, uma capacidade inicial apropriada deverá ser escolhida cuidadosamente. Escolher uma capacidade muito grande desperdiça espaço e tempo. A capacidade inicial padrão é 101, que geralmente é mais do que você precisa. Você pode usar o construtor int para especificar a capacidade inicial. A capacidade inicial do HashSet a ser alocada é 17:
Definir s= novo HashSet(17);
HashSets também possuem um "parâmetro de ajuste" chamado fator de carga. Se você está muito preocupado com o uso de espaço do seu HashSet, leia o texto do HashSet para obter detalhes. Caso contrário, basta usar o valor padrão. Se você aceitar o fator de carga padrão, mas quiser especificar uma capacidade inicial, escolha um número que seja aproximadamente o dobro da capacidade que você espera que seu conjunto cresça. Se o seu palpite estiver errado, ele pode crescer ou apenas desperdiçar um pouco de espaço. Mas não há grandes problemas. Se você sabe o melhor valor para o tamanho correto, use-o; se não souber, use um valor antigo ou um valor par. Realmente não é muito importante. Essas coisas apenas tornam o HashSet um pouco melhor.
TreeSet não possui parâmetros de ajuste. Além de clonar, HashSet e TreeSet possuem apenas as operações exigidas por suas respectivas interfaces (Set e TreeSet) e nenhuma outra operação.