5.FreshMinutes.IT – Java & IT

5 minutes pour consolider ses connaissances en Java et dans les Nouvelles Technos.
  • Accueil
  • À propos
  • Contact, Twitter, Tumblr & Buzz

Accélerer vos tests et vos recherches avec hashCode()

Eric Vialle | Lundi 19 mai 2008 | 8:22


Chaque objet contient la méthode boolean equals() et int hashCode(). Ces deux méthodes héritent de l’objet java.lang.Objet dont tous les objets héritent. Nous allons voir qu’est ce que le HashCode, comment on l’utilise, puis comment optimiser nos recherches et nos tests d’objets avec ce concept.

Qu’est ce que le HashCode ?

Un HashCode représente une signature d’un objet. Il s’agit d’un entier de type int (32 bits). Celui-ci est calculé selon un algorithme prenant en compte son contenu.

Chaque type d’objet a sa propre implémentation. Vous pouvez vous aussi implementer la votre dans une classe, il suffit d’implémenter cette méthode

  1. @Override
  2. int hashCode() {
  3. // votre implementation
  4. }

Par exemple, l’algorithme générant le HashCode de la classe String repose sur l’algorithme:

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

Bien qu’il y ait 1 chance sur 4294967296, deux objets différents peuvent avoir le même HashCode. Cette probabilité s’agrandit si le HashCode est mal conçu…

Théoriquement, pour deux objets o1 et o2,

  • Si o1.equals(o2), alors o1.hashCode() == o2.hashCode()
  • Si o1.hashCode() == o2.hashCode(), alors il n’est pas sur que o1.equals(02)
  • Si o1.hashCode() != o2.hashCode() , alors o1.equals(o2) n’est pas vrai

Nous allons utiliser cette propriété afin de l’utiliser lors de nos tests de recherches.

Optimiser votre recherche sur une Collection.

Petit rappel sur les Collection. Collection est une interface Java définissant les objets comme un regroupement d’autres objets. Par exemple, ArrayList, HashMap, implémentent l’interface Collection.

Notre recherche se base sur le fait que nous avons un élément et nous allons essayer de retrouver un élément identique dans une collection.

Notre principe de recherche se base sur le fait que comparer deux hashcodes (qui sont des entiers) est plus rapide que de comparer deux objets avec equals(). Si les deux hashcodes sont identiques, on s’assurera de leur égalité avec la méthode equals(). Sinon, on testera l’objet suivant.

L’exemple suivant montre une implémentation de ce principe. Nous allons vérifier si un élément existe dans une collection.

  1.         //on crée une collection déjà remplie
  2.         Collection maCollection = new ArrayList();
  3.         maCollection.add("Five");
  4.         maCollection.add("Fresh");
  5.         maCollection.add("Minutes");
  6.         maCollection.add("IT");
  7.         maCollection.add("Blog");
  8.  
  9.         //on selection une String à rechercher.
  10.         String stringRechercher = "IT";
  11.         //on calcule à l'avance son HashCode
  12.         int hashCodeDeStringRechercher = stringRechercher.hashCode();
  13.  
  14.         //flag
  15.         boolean exists = false;
  16.  
  17.         //boucle
  18.         for (String aTester: maCollection) {
  19.             //on teste le hashcode
  20.             if (hashCodeDeStringRechercher == aTester.hashCode()) {
  21.                 //le hashcode est le meme, on regarde si les objets sont identiques
  22.                 if (stringRechercher.equals(aTester)) {
  23.                      exists = true;
  24.                 }
  25.             }
  26.         }
  27.         System.out.println("L'element est présent? " + exists);

A lire:

  • 7 pages sur la méthode hashCode()
  • Cours sur les Collections en Java
  • Javadoc de Collection
  • Javadoc de java.lang.Object
  • Autres cours sur les Collections.


Catégories
Dévelopement Tips, J2ME, J2SE, Java, Java EE
Tags
equals, hascode, Java, performance, test
Flux rss des commentaires
Flux rss des commentaires
Trackback
Trackback

« 5 Fresh Minutes IT est compatible Mobile Java Community Process à Paris, le 21 Mai 2008 »

2 Responses to “Accélerer vos tests et vos recherches avec hashCode()”

  1. bill gates dit :
    Jeudi 29 mai 2008 à 10:17

    juste un petitvcommentaire pour te dire que c’est très agréable e lire ton bloh :)

  2. fred dit :
    Lundi 1 septembre 2008 à 3:48

    HashSet permet de profiter de ce genre d’optimisation.
    Sinon, pour etre plus rapide, il faudrait arrêter la boucle dès que l’objet voulu est trouvé

Leave a Reply

Cliquez ici pour annuler la réponse.

Articles récents

  • Push & communications asynchrones sur iOS (iPhone/iPad)
  • Optimiser le temps de chargement pour le web mobile avec iPhone, jQTouch, Struts 2 et Tomcat
  • La philosophie du Domain Driven Design User Group et l’état des lieux * Users Group en Février 2010
  • Introduction au NoSQL (et de Redis) ou le compte rendu du NoSQL User Group Paris de Février 2010
  • Gérer le Cache-Control HTTP dans une application Web Java EE avec Tomcat
  • Compiler son code? “It’s so 2000s” ou un apercu de Play et JRebel
  • Le blog change d’adresse
  • Le Paris JUG a fêté ses 2 ans: compte-rendu

Navigation

  • Actualités Flux pour tous les articles classés dans Actualités
  • Architecture IT Flux pour tous les articles classés dans Architecture IT
  • Base de données Flux pour tous les articles classés dans Base de données
  • Java Flux pour tous les articles classés dans Java
    • Dévelopement Tips Flux pour tous les articles classés dans Dévelopement Tips
    • EDI Flux pour tous les articles classés dans EDI
    • J2ME Flux pour tous les articles classés dans J2ME
    • J2SE Flux pour tous les articles classés dans J2SE
    • Java EE Flux pour tous les articles classés dans Java EE
    • Tutoriel Flux pour tous les articles classés dans Tutoriel
  • Non classé Flux pour tous les articles classés dans Non classé
  • NoSQL Flux pour tous les articles classés dans NoSQL

Promo

Mots Clefs

adobe apache application web Base de données benchmark bugs c# checkstyle dérivation eclipse find bugs findbugs flex framework play google gzip http iPhone jar Java Java User Group java web start JVM microsoft mysql object objet open source optimisation oracle performance plugin pmd polymorphisme qualité recrutement rich internet application serveur silverlight struts struts 2 sun test Tomcat web

WP Cumulus Flash tag cloud by Roy Tanck and Luke Morton requires Flash Player 9 or better.

Twitter

  • J'ai testé OnLive Games sur mon Mac en Wifi: vraiment impressionnant que les possibilités du cloud gaming 2011-01-17
  • More updates...

Livres Pour Aller Plus Loin…

Blogoliste

  • Berthou.com
  • Le blog de hugu
  • PHP – Le Blog de Fatiha
  • techno.blog(java4it)
Get Adobe Flash playerPlugin by wpburn.com wordpress themes
rss Flux rss des commentaires valid xhtml 1.1 design by jide powered by Wordpress get firefox