Donc, de nombreuses classes personnalisées ont également des classes personnalisées à l'intérieur d'eux à l'aide de la composition.
Mes classes personnalisées ont des variables qui changent très souvent et que je les ajoute aux hashsets. Donc, ma question est quand je mettant en place hashcode - Que dois-je faire pour une classe qui n'a que des champs privés qui change constamment? p>
Voici un exemple de classe personnalisée: p>
3 Réponses :
Voici l'exemple de classe qui a des champs privés.
public class Test { private int num; private String data; public boolean equals(Object obj) { if (this == obj) return true; if ((obj == null) || (obj.getClass() != this.getClass())) return false; // object must be Test at this point Test test = (Test) obj; return num == test.num && (data == test.data || (data != null && data .equals(test.data))); } public int hashCode() { int hash = 7; hash = 31 * hash + num; hash = 31 * hash + (null == data ? 0 : data.hashCode()); return hash; } }
Vous ne pouvez pas implémenter HASCODE à l'aide de valeurs booléennes. Code> Vous pourriez, mais cela pourrait ne pas sembler jolie.
Oui, tu es Wright. Mais il n'est pas utile de créer HashCode en utilisant des valeurs booléennes.
Nous devons remplacer HashCode () lorsque nous remplaçons la méthode Equals (), la méthode Equals, Java doit suivre son contrat avec la méthode HashCode en Java, comme indiqué ci-dessous. . P>
Celles-ci sont des échantillons de mise en oeuvre d'équivalements et de méthodes de code HASHCODE pour votre classe: p>
Comment supposez-vous que cela aidera? Je veux dire que vous utilisez des champs mutables dans HASHCODE. Maintenant, si l'objet de la cellule est utilisé comme clé dans la collecte hachée et que les deux champs étaient tristes alors qu'il a été entré dans HASHMAP, les champs changent maintenant et de même que HashCode! Si vous essayez maintenant de rechercher quelque chose en fonction de cet objet, le hashmap recherchera un autre seau et non l'original et vous ne trouverez pas l'objet.
@Narendrapathai: Si une instance particulière d'un objet avec un champ mutable ne sera jamais exposée au code qui muterait ce champ, est-ce que le champ de cette instance est vraiment mutable? Code qui stocke des objets de collections hachées dont le hachage dépend des champs mutables doit s'assurer que les objets stockés dans la collection ne sont pas exposés à un code pouvant entraîner une modification de son hachage lorsqu'il est stocké dans la collection Hashed. Souvent, le moyen le plus simple de fournir cette garantie est de rendre l'objet immuable, mais dans certains cas, il peut être plus pratique ...
... pour éviter d'exposer une instance d'objet à tout ce qui ne connaît pas les collections hachées dans lesquelles il est stocké et que toute demande de modification de l'instance supprimera l'instance inchangée des collections, puis effectuez le changement et Ajoutez ensuite l'instance modifiée dans les collections.
Plutôt que d'essayer de mettre en œuvre votre propre méthode HashCode (), vous devez utiliser des implémentations standard existantes dans la mesure du possible, telles que celle de la chaîne. Pour ce faire, d'abord mettre en œuvre Tostring () pour votre objet. Ensuite, la méthode égale () pour votre objet peut être construite à l'aide de la totring (). Equals () et la méthode HashCode () pour votre objet ne peuvent que renvoyer cela.Tostring (). Hashcode ().
vous êtes sol. Lorsque HashCode () est utilisé dans une clé dans des collections Java standard, elle ne devrait pas changer. Ou bien vous avez besoin d'une implémentation de hashset personnalisée. P>
Utilisez uniquement des champs non changeants (ou, si vous audez et ne vous dérangez pas des accidents occasionnels, des champs changeants très rarement) pour calculer HashCode (). P>
(ajouté). Dans votre exemple particulier, utilisez objet.hashcode (). P>
(ajouté n ° 2) Même si votre classe de cellules était immuable (les deux booléens n'ont pas changé), il fait un mauvais choix pour le hachage, car il n'a que 2 bits de portée. Imaginez hachage à toutes les personnes de savoir s'ils sont des yeux hommes / femmes et bleus / yeux bruns. Un très bon début, mais il n'y a que 4 catégories, et il y aura 2 milliards de personnes dans chacune d'elles. Idéalement, vous auriez plusieurs autres catégories, comme année de naissance, pays de naissance, etc. p>
Je suppose que sur la base de seulement deux variables booléennes hashcode ne peut être générée de manière unique. Vous devez ajouter d'autres variables dans la classe. Par exemple, la coordonnée X et Y de la cellule (juste un exemple). Je suppose que ce n'est pas l'ensemble du code de la classe.
L'esprit que si vous utilisez la cellule comme clé de la carte, alors cela créera un problème car la collection Hash ne saura pas sur le hashcode modifié. Donc, une fois que l'objet est ajouté en tant que clé de la collection Hashed Son HashCode ne doit pas changer. Vous pouvez conserver un identifiant unique pour la cellule et l'utiliser comme clé.
Cela dépend de ce que vous recherchez dans le hashset. Recherchez-vous un objet particulier, auquel cas NON NON implémentez pas de hashcode ou égal ou pour un objet avec un état particulier, dans quel cas vous implémentez un code HASHCODE et égaux à l'aide des variables d'état qui vous intéressent. Les champs qui sont constamment. La modification ne doit pas être utilisée pour la fonction HashCode, sinon l'objet sera "perdu".
Pour mettre en œuvre correctement le hashcode et les égaux, je vous recommande de lire la section HASHCODE et égale à la section Efficace Java de Joshua. Il a expliqué les choses en détail difficiles à expliquer ici.