web-dev-qa-db-fra.com

Existe-t-il une structure de hachage Java avec des clés uniquement et aucune valeur?

Je cherche une structure qui hache les clés sans nécessiter de valeur. Quand interrogé, il devrait retourner vrai si la clé est trouvée et faux sinon. Je recherche quelque chose de similaire à Hashtable<MyClass, Boolean> , Sauf que l'insertion ne nécessite qu'une clé et que les requêtes ne renvoient jamais que vrai ou faux, jamais null.

36
Obediah Stane

Vous avez besoin de Java/ HashSet .

La description de la documentation officielle est:

Cette classe implémente l'interface Set, adossée à une table de hachage (en fait une instance de HashMap). Il ne fait aucune garantie quant au ordre d'itération de l'ensemble; en particulier, cela ne garantit pas que l'ordre restera constant dans le temps. Cette classe autorise le null élément.

Cette classe offre une performance à temps constant pour les opérations de base (ajouter, supprimer, contient et taille), en supposant que la fonction de hachage se disperse les éléments correctement parmi les seaux. Itérant sur cet ensemble nécessite du temps proportionnel à la somme de la taille de l'instance HashSet (le nombre d'éléments) plus la "capacité" du support HashMap instance (le nombre de seaux). Il est donc très important de ne pas définir la capacité initiale est trop élevée (ou le facteur de charge est trop faible) si la performance d'itération est importante.

Notez que cette implémentation n'est pas synchronisée. Si plusieurs threads accéder simultanément à un ensemble de hachage et à au moins un des threads modifie l'ensemble, il doit être synchronisé en externe. C'est généralement accompli en synchronisant sur un objet qui naturellement encapsule l'ensemble. Si aucun objet de ce type n'existe, l'ensemble devrait être "encapsulé" à l'aide de la méthode Collections.synchronizedSet. C'est le mieux. effectué au moment de la création, pour éviter tout accès non synchronisé accidentel à l'ensemble:

Définissez s = Collections.synchronizedSet (new HashSet (...));

Les itérateurs renvoyés par la méthode iterator de cette classe ont la capacité de réussir rapidement: si l'ensemble est modifié à tout moment après la création de l'itérateur, dans de toute façon, sauf par la méthode de suppression de l'itérateur, l'Iterator lève une exception ConcurrentModificationException. Ainsi, face à modification simultanée, l’itérateur échoue rapidement et proprement, plutôt que de risquer un comportement arbitraire, non déterministe à un temps indéterminé dans le futur.

Notez que le comportement d'échec rapide d'un itérateur ne peut pas être garanti comme il est généralement impossible de faire des garanties fermes en présence d'une modification concurrente non synchronisée. Fail-fast les itérateurs lancent ConcurrentModificationException au meilleur effort base. Par conséquent, il serait faux d’écrire un programme dépendant sur cette exception pour son exactitude: le comportement rapide de les itérateurs ne doivent être utilisés que pour détecter les bogues.

Cette classe est membre de Java Collections Framework.

74
Gant

Java.util.HashSet? Utilisation de contient () pour votre recherche.

14
Lawrence Dol

Voir aussi les méthodes statiques Collections#newSetFromMap qui créent un ensemble basé sur l'implémentation de carte donnée. C'est par exemple pratique pour créer un ensemble de hachage faible.

2
akuhn

Java Set est conçu pour supprimer les doublons et, espérons-le, HashMap doit utiliser Java Set en interne pour gérer les clés car les clés ne peuvent jamais avoir de doublons.

0
Ashok Koyi