hashCode()
n'est pas destinée à fournir un identifiant unique pour un objet. Elle digère plutôt l'état de l'objet (c'est-à-dire les valeurs des champs membres) en un seul entier. Cette valeur est principalement utilisée par certaines structures de données basées sur le hachage, telles que les cartes et les ensembles, pour stocker et récupérer efficacement les objets.
Si vous avez besoin d'un identifiant pour vos objets, je vous recommande d'ajouter votre propre méthode au lieu de surcharger la méthode hashCode
. À cette fin, vous pouvez créer une interface de base (ou une classe abstraite) comme ci-dessous.
public interface IdentifiedObject<I> {
I getId();
}
Exemple d'utilisation :
public class User implements IdentifiedObject<Integer> {
private Integer studentId;
public User(Integer studentId) {
this.studentId = studentId;
}
@Override
public Integer getId() {
return studentId;
}
}
38 votes
Principalement pour des raisons de "débogage" ;) Pour pouvoir dire : Ah, même objet !
6 votes
À cette fin, la fonction System.identityHashcode() est probablement utile. Cependant, je ne m'y fierais pas pour mettre en œuvre une fonctionnalité de code. Si vous souhaitez identifier les objets de manière unique, vous pouvez utiliser AspectJ et insérer un identifiant unique pour chaque objet créé. Plus de travail, cependant
9 votes
Gardez à l'esprit que l'unicité du hashCode n'est PAS garantie. Même si l'implémentation utilise l'adresse mémoire comme code de hachage par défaut. Pourquoi n'est-il pas unique ? Parce que les objets sont ramassés et que la mémoire est réutilisée.
1 votes
Notez cette CR pour les documents de l'API : bugs.sun.com/bugdatabase/view_bug.do?bug_id=6321873
8 votes
Si vous souhaitez déterminer si deux objets sont identiques, utilisez == au lieu de hashCode(). Cette dernière n'est pas garantie d'être unique, même dans l'implémentation originale.
0 votes
Il suffit de générer son propre identifiant unique lors de l'instanciation par le biais d'un fichier
static AtomicInteger()
9 votes
Aucune des réponses ne répond à la vraie question parce qu'elles s'emmêlent dans la discussion sur hashCode(), qui était accessoire ici. Si je regarde les variables de référence dans Eclipse, je vois un "id=xxx" unique et immuable. Comment accéder à cette valeur de manière programmatique sans avoir à utiliser notre propre générateur d'identifiant ? Je veux accéder à cette valeur à des fins de débogage (journalisation) afin d'identifier des instances distinctes d'objets. Quelqu'un sait-il comment mettre la main sur cette valeur ?
0 votes
@Mnementh pour le débogage, il arrive que des objets soient égaux mais que l'on veuille quand même savoir s'il s'agit d'objets différents, il vaut mieux se référer à ces deux objets en tant que équivalent plutôt que les mêmes - Bien que je ne sois pas sûr de la terminologie correcte en langage informatique, c'est celle qui a le plus de sens en anglais. Sinon, cela peut prêter à confusion
0 votes
@ycomp:En Java, == compare les références, ce qui signifie qu'il n'est vrai que pour le même objet. Pour comparer l'égalité, vous devez utiliser la méthode euqals(). Supposons que a= new Integer(1);b = new Integer(1) ; a==b est faux alors que a.equals(b) est vrai.
0 votes
@Mnementh désolé, je m'excuse, utiliser kotlin comme langage principal a vraiment grillé mon cerveau quand il s'agit de java (quand je suis fatigué).
0 votes
Votre identifiant unique doit-il être un nombre entier ou une chaîne de caractères ? Pourquoi ne pas utiliser l'élément
Object
l'instance elle-même ? Il s'agit en fait d'un pointeur unique vers tout ce qui hérite d'un objet.