La réponse de Jon Skeet aborde bien les deux scénarios (carte avec null
valeur et non null
valeur) de manière efficace.
Concernant les entrées de nombres et le souci d'efficacité, je voudrais ajouter quelque chose.
J'ai un HashMap avec disons 1.000 entrées et je cherche à améliorer l'efficacité. Si le HashMap est utilisé très fréquemment, la vérification de l'existence de la clé à chaque accès entraînera une surcharge importante.
Une carte avec 1.000 entrées n'est pas une carte énorme.
Ainsi qu'une carte avec 5.000 ou 10.000 entrées.
Map
sont conçus pour permettre une récupération rapide avec de telles dimensions.
Maintenant, il suppose que hashCode()
les clés de carte fournissent une bonne distribution.
Si vous pouvez utiliser un Integer
type de clé as, faites-le.
Sa hashCode()
méthode est très efficace car les collisions ne sont pas possibles pour des int
valeurs uniques :
public final class Integer extends Number implements Comparable<Integer> {
...
@Override
public int hashCode() {
return Integer.hashCode(value);
}
public static int hashCode(int value) {
return value;
}
...
}
Si pour la clé, vous devez utiliser un autre type intégré comme String
par exemple qui est souvent utilisé dans Map
, vous pouvez avoir des collisions mais de 1 000 à quelques milliers d'objets dans le Map
, vous devriez en avoir très peu comme String.hashCode()
méthode fournit une bonne distribution.
Si vous utilisez un type personnalisé, remplacez hashCode()
-le equals()
correctement et assurez- hashCode()
vous que l'ensemble fournit une distribution équitable.
Vous pouvez vous référer au point 9 de la Java Effective
réfère.
Voici un article qui détaille le chemin.