2016-04-25 3 views
-2

Wann kann der Hashcode von zwei new Date() Objekten gleich sein?System.out.println (neues Date(). HashCode()); wird der Hashcode-Wert jedes Mal anders sein

Zum Beispiel hat new Date() nie den gleichen Wert, also wird der Hashcode-Wert jedes Mal anders sein, wenn dieser Code ausgeführt wird?

System.out.println(new Date().hashCode()); 
+2

Warum versuchst du es nicht? –

+0

[Lesen Sie das Javadoc] (https://docs.oracle.com/javase/8/docs/api/java/util/Date.html#hashCode--), das beschreibt, wie es berechnet wird. –

Antwort

4

Datum des hashCodegetTime verwendet, die die Anzahl der Millisekunden zurück, seit dem 1. Januar 1970, 00:00:00 GMT, es mehrmals auf schnelle modernen Maschinen Aufruf ist sehr wahrscheinlich den gleichen Wert zu erzeugen.

Wenn ich es auf meinem Rechner laufen, erzeugt es die folgende:

System.out.println(new Date().hashCode()); //1328556618 
System.out.println(new Date().hashCode()); //1328556618 
System.out.println(new Date().hashCode()); //1328556618 

Und btw, ist System.currentTimeMillis() mehrmals Aufruf sehr wahrscheinlich gleichen Werte zu erzeugen.

0

Sie können im Allgemeinen erwarten, dass zwei ungleiche Objekte unterschiedliche Hashcodes haben. Aber nach den contract, ist es nie eine Garantie die Hashcodes für zwei Objekte werden anders sein:

  • Es ist nicht erforderlich, dass, wenn zwei Objekte ungleich sind nach der equals(java.lang.Object) Methode, dann die hashCode Aufruf Methode für jedes der beiden Objekte muss eindeutige ganzzahlige Ergebnisse erzeugen.

Aber Ihre Aussage, dass jedes neue Date Objekt einen anderen Wert hat, ist nicht korrekt. Date hat nur Millisekunden-Genauigkeit, was bedeutet, dass Sie viele Objekte in einer Reihe mit dem gleichen Wert generieren können.

0

Nach dem Javadoc wird die hashCode wie folgt berechnet:

(int)(this.getTime()^(this.getTime() >>> 32)) 

daher zwei Daten Hash-Codes erstellen zwei Daten mit der gleichen Zeit:

Date d1 = new Date(); 
System.out.println(d1.hashCode()); 
Date d2 = new Date(d1.getTime()); 
System.out.println(d2.hashCode()); // Same as d1.hashCode(); 

Oder die Zeiten festgelegt werden das gleiche:

Date d1 = new Date(); 
System.out.println(d1.hashCode()); 
Thread.sleep(1000); // Just to make sure they're not the same time initially. 
Date d2 = new Date(); 
System.out.println(d2.hashCode()); // Different to d1.hashCode(); 
d2.setTime(d1.getTime()); 
System.out.println(d2.hashCode()); // Same as d1.hashCode(); 
Verwandte Themen