2016-01-26 3 views
1

Je veux avoir une carte en Java alors j'ai pensé HashMap. Mais maintenant, je veux surmonter les frais généraux introduits par le hachage. Fondamentalement, il y a des objets qui contiennent une clé pour la carte pendant très peu de temps - mais beaucoup d'entre eux, et interrogent/remplacent une valeur souvent. Donc, je pensais que les frais généraux de hachage de la clé chaque fois que get() ou set() est appelé pourrait être important et aussi surmonter. J'ai donc pensé, avec la clé, en sauvant le hachage de la clé - et en réduisant les frais généraux.Java HashMap qui peut être consulté par hachage

Est-il possible en Java get() et set() une valeur avec la clé et un hachage précalculé pour la clé - et bien sûr obtenir cette clé de la carte de cohérence pour éviter la surcharge de la carte ayant pour hacher la clé?

+0

"Je veux avoir une carte en Java qui a une vitesse d'accès O (log n), donc j'ai pensé HashMap" - c'est étrange de penser cela. HashMap est O (1), O (N) dans le pire des cas. Les cartes basées sur des commandes telles que TreeMap seraient O (log n). – user2357112

+0

Si vous demandez si vous pouvez entrer une carte sur un hachage lui-même plutôt qu'un objet qui génère un hachage; alors oui, c'est essentiellement ce que vous obtenez si vous utilisez 'Integer' comme type de clé. À part ça, je ne suis pas sûr de ce que vous demandez. – khelwood

+0

@khelwood Si j'utilise Integer, il va encore hacher l'entier, n'est-ce pas? cela semble pas beaucoup de frais généraux, certainement réduire, mais pas tout à fait là. Je vais le considérer. – WorldSEnder

Répondre

2

Un objet peut mettre en cache son code de hachage, de sorte que lorsqu'il est utilisé de manière répétée en tant que clé, le hachage peut être éliminé. Par exemple, java.lang.String fait cela. La classe Integer fait de même. Votre classe de clé personnalisée peut suivre ce modèle.

+0

Java 'String' et' Integer' supportent un motif unique que les objets sont partagés. Les littéraux de chaîne et les entiers obtenus via 'Integer.valueOf (123)' suivent ce modèle. La mise en cache des clés de hachage présente un avantage évident suivant ce modèle. Sinon, vous voulez vous assurer que la clé de hachage n'est pas répétée pour justifier la mise en cache. – neurite

+0

Je pense que le mot qui manque partout est immuabilité. Si l'obj est immuable ** et ** le hachage est probable, il est tout à fait logique de mettre en cache le hashCode avec impatience. Pour tout autre scénario, il existe un équilibre entre la mise en cache paresseuse et la non-mise en cache (également beaucoup plus simple) que seul un benchmark approprié peut décider. –

+1

Cela n'a rien à voir avec les instances partagées. La plupart des instances de 'String' ne sont pas internées, et seules 256 instances' Integer' sont garanties pour être mises en cache. De même, l'immutabilité effective est un critère important pour toute clé de hachage; mais la mise en cache du code de hachage ne lui confère aucune importance supplémentaire. – erickson