new SimpleDateFormat gibt immer die gleiche Referenz für ein bestimmtes dateFormat zurück

8


  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

    
rixmath 24.05.2013, 09:51
quelle

3 Antworten

14

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:

%Vor%

Nun wird SimpleDateFormat hashCode generiert:

%Vor%

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.

    
Adam Siemion 24.05.2013, 09:53
quelle
6

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() :

%Vor%

Dies wird 3 verschiedene Werte drucken.

    
Joachim Sauer 24.05.2013 10:01
quelle
5

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

    
Evgeniy Dorofeev 24.05.2013 10:01
quelle

Tags und Links