8
votes

nouveau SimpleDateFormat renvoie toujours la même référence pour une date de date donnée


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> xxx pré>

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


2 commentaires

Sont-ils réellement la même instance (avec == )?


Et pour répondre à la dernière question: non, un nouveau dans Java sera Toujours Résultat dans un nouvel objet (sauf s'il n'entrène pas à une exception). Le JVM n'est pas autorisé à optimiser cela.


3 Réponses :


14
votes

SimpleDateDormat ni dateformat ( SimpleDateFormat Superclass) ni format ( dateforme Superclass ) avoir un tostring () implémenté, de sorte que le tostring () à partir de la classe d'objet est réellement exécuté, dont le code est: xxx

maintenant, SimpleDateFormat HashCode est généré: xxx

ce qui signifie que si vous créez de nombreux SimpleDateDormat Instances avec le même modèle , comme dans votre cas, ils auront le même hashcode et donc tostring () retournera la même chose pour ces instances.

En outre, comme il a été repéré par RixMath, SimpleDateDormat Les instances avec le même modèle seront également égaux .


8 commentaires

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 avec le même motif ne sera pas égal ( ob1.equals (obj2) == faux ) mais aura le même hashcode .


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 avec le même motif sera à la fois égal ( ob1.equals (obj2) == vrai ) et aura le même hashcode .



5
votes

Ce sont des instances différentes, essayez ceci xxx

IT imprime xxx

comme pour le même java.text.simpledateformat @ C5BFBC60 , 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


0 commentaires

6
votes

SimpleDateFormat implémente réellement hashcode en renvoyant le hashcode du motif.

Vous pouvez vérifier qu'il existe des objets distincts en utilisant :: xxx

Ceci imprimera 3 valeurs différentes.


2 commentaires

Le code de hachage d'identité de deux objets distincts peut également être le même. L'opérateur == doit être utilisé à la place pour vérifier que deux objets sont distincts.


@Spacetrucker: C'est vrai, c'est mai être pareil, mais c'est très peu probable.