Ich habe versucht, einen Fehler zu replizieren, indem ich dieselbe Instanz von SimpleDateFormat für mehrere Threads verwende. Ich blieb jedoch bei einem anderen Problem stecken und fand keine Antworten darauf.
Dieser einfache Codeblock repliziert die Probleme, die ich sehe.
%Vor%Die Ergebnisse dieser Operationen unter Java 7 (1.7_0_21) lauten wie folgt
%Vor% Wie Sie sehen, obwohl ich neue Objekte für d1 und d2 erstelle, sind sie die gleiche Referenz. d3 endet als neue Instanz, da das Muster anders ist.
Macht Java Compilieren / Runtime diese Optimierung? Alle Zeiger werden hilfreich sein
SimpleDateFormat
noch DateFormat
( SimpleDateFormat
superklasse) noch Format
( DateFormat
superklasse) haben eine toString()
implementiert, also wird die toString()
aus der Object
Klasse tatsächlich ausgeführt, deren Code ist:
Nun wird SimpleDateFormat
hashCode generiert:
Das bedeutet, dass wenn Sie zahlreiche SimpleDateFormat
Instanzen mit dem gleichen pattern
erstellen, wie in Ihrem Fall, haben sie das gleiche hashCode
und daher wird toString()
das gleiche Ergebnis liefern für diese Fälle.
Außerdem, wie es von rixmath entdeckt wurde, sind SimpleDateFormat
Instanzen mit dem gleichen pattern
auch gleich.
SimpleDateFormat
implementiert tatsächlich hashCode
, indem der Hashcode des Musters zurückgegeben wird.
Sie können überprüfen, ob tatsächlich unterschiedliche Objekte vorhanden sind, indem Sie System.identityHashCode()
:
Dies wird 3 verschiedene Werte drucken.
Sie sind verschiedene Instanzen, versuchen Sie dies
%Vor%druckt
%Vor% wie für die gleiche java.text.SimpleDateFormat@c5bfbc60
, sie basieren auf dem Klassennamen und hashCode. Gemäß der Object.hashCode-API gibt es nicht unbedingt eindeutige Werte für unterschiedliche Objekte zurück
Tags und Links java