J'essayais de reproduire un bug en utilisant la même instance de SimpleDateDeformat sur plusieurs threads. Cependant, je suis coincé avec un autre problème et je n'ai trouvé aucune réponse à cela.
Ce bloc de code simple réplique les problèmes que je vois. p> Les résultats de ces opérations sous Java 7 (1.7_0_21) sont comme suit p> d1 = java.text.SimpleDateFormat@c5bfbc60
d2 = java.text.SimpleDateFormat@c5bfbc60
d3 = java.text.SimpleDateFormat@b049fd40
3 Réponses :
maintenant, ce qui signifie que si vous créez de nombreux En outre, comme il a été repéré par RixMath, SimpleDateDormat code> ni dateformat code> ( SimpleDateFormat code> Superclass) ni format code> ( dateforme code> Superclass ) avoir un tostring () code> implémenté, de sorte que le tostring () code> à partir de la classe d'objet code> est réellement exécuté, dont le code est: SimpleDateFormat code> HashCode est généré: p> SimpleDateDormat Code > Instances avec le même modèle code> code>, comme dans votre cas, ils auront le même hashcode code> strong> et donc tostring () code > retournera la même chose pour ces instances. P> SimpleDateDormat code> Les instances avec le même modèle code> seront également égaux . p> p>
Je pense que vous n'avez pas eu sa question. Il demande pourquoi les deux références (D1, D2) sont-elles pointées vers le même objet SimpleDateFormat. Jetez un coup d'œil à son hashcode. C'est pareil.
Droite, mais ce n'est pas la question. Il est perplexe pourquoi deux variables pointent sur le même objet quand on pourrait s'attendre différemment. docs.oracle.com/javase/ 6 / Docs / API / Java / Lang / ...
Merci. J'aurais dû creuser un peu plus avant de demander cela. Ils sont en effet des références séparées. (Je viens de déboguer ce code et trouvé.)
@assylia vraiment, je suppose que je le pensais toujours.
@Ankur merci d'avoir souligné cela, j'ai mis à jour la réponse
Deux SimpleDateformat code> avec le même motif ne sera pas égal ( ob1.equals (obj2) == faux code>) mais aura le même hashcode code>.
Réellement. Ce n'est pas vrai. Deux simplesDatedormat avec le même modèle renvoie true. C'est le code en Java7
Boolean public Equals (Obj Obj) {Si (! Super.equals (Obj)) retourne faux; // super fait le chèque de classe SimpleDateDeformat qui = (simpledateFormat) obj; retour (modèle.equals (ça.pattern) && formatdata.equaux (ça.formatdata)); }
@ Trixmath Bon point, vous avez raison, mon commentaire précédent était incorrect dans ce cas, deux SimpleDateDormat code> avec le même motif sera à la fois égal ( ob1.equals (obj2) == vrai code>) et aura le même hashcode code>.
Ce sont des instances différentes, essayez ceci IT imprime p> comme pour le même java.text.simpledateformat @ C5BFBC60 CODE>, ils sont basés sur le nom de la classe et le casquette. Selon l'API Object.HashCode, il ne renvoie pas nécessairement des valeurs distinctes pour des objets distincts p> p>
Vous pouvez vérifier qu'il existe des objets distincts en utilisant Ceci imprimera 3 valeurs différentes. p> p> SimpleDateFormat code> implémente réellement hashcode code> en renvoyant le hashcode du motif. :: p>
Le code de hachage d'identité de deux objets distincts peut également être le même. L'opérateur == code> doit être utilisé à la place pour vérifier que deux objets sont distincts.
@Spacetrucker: C'est vrai, c'est mai i> être pareil, mais c'est très peu probable.
Sont-ils réellement la même instance (avec
== code>)?Et pour répondre à la dernière question: non, un
nouveau code> dans Java sera Toujours B> Résultat dans un nouvel objet (sauf s'il n'entrène pas à une exception). Le JVM n'est pas autorisé à optimiser cela.