2012-02-12 8 views
5

C'è un modo per vedere effettivamente il codice sorgente delle classi Java standard? Sto facendo un hash table of points (HashSet<Point>) e voglio assicurarmi che andrà bene, ma non riesco a vedere quale sia il metodo di hashCode() di Point in realtà, quindi non so quanto sia bello è. Qualcuno può aiutarmi? Dovrei scavalcarlo? E se è così, c'è un modo semplice per farlo senza creare un nuovo file java/classe?Java - Il metodo hashCode() della classe Point è valido, o dovrei sovrascriverlo e scriverne uno mio?

+0

Non conosco altri IDE, ma in Eclipse è possibile collegare il codice sorgente alla libreria di Java. Finestra -> Preferenze -> Java -> JRE installati -> Seleziona i JAR -> Allegato origine. Passare alla src.zip che ottieni con il tuo JDK (o seguendo il link di Jon Skeet) e voilà. – Jeffrey

+0

La fonte si trova in 'src.zip' all'interno della directory JDK. –

+0

Puoi anche google> sorgente java awt point e il primo risultato di ricerca sarà probabilmente il codice sorgente completo per la classe :-) – Yuval

risposta

8

Se si sta cercando lo hashCode() di java.awt.Point, è definito in java.awt.geom.Point2D.

/** 
* Returns the hashcode for this <code>Point2D</code>. 
* @return  a hash code for this <code>Point2D</code>. 
*/ 
public int hashCode() { 
    long bits = java.lang.Double.doubleToLongBits(getX()); 
    bits ^= java.lang.Double.doubleToLongBits(getY()) * 31; 
    return (((int) bits)^((int) (bits >> 32))); 
} 

Nota che la questione "Sarà hash bene?" è difficile da rispondere, dipende principalmente dal modello di utilizzo.

è possibile accedere al codice sorgente di quasi tutti i "classi Java standard", basta cercare il file src.zip nella directory di installazione del JDK (o usare un IDE come Eclipse/NetBeans e cliccare F3 sul nome della classe).

+1

Questa non è una cattiva implementazione del codice hash, come succede. Non quello che chiamerei sicuro contro un attacco deliberato, ma perfettamente adatto per l'uso quotidiano. –

+0

Grazie !!!!!!!!! – Tim

+0

@Louis Wasserman: Nota che non ho detto che è male, mi riferivo alla domanda di Tim _ "Voglio assicurarmi che faccia un bel hash" _. Credo che non si debba toccare il comportamento predefinito, dovrebbero essere abbastanza in generale. Nella mia esperienza, dopo averlo profilato, si riduce sempre a qualche altra parte del codice che causa il collo di bottiglia. – rlegendi

3

C'è un modo per vedere effettivamente il codice sorgente delle classi Java standard a proposito?

Sì, credo che in genere venga fornito con il JDK, in un file src.zip all'interno della directory JDK. Se non lo è, il modo per ottenerlo dipenderà dalla versione di Java che stai utilizzando. La sorgente completa di JDK 6 è disponibile per esempio here o JDK 7 ha un source code download page separato con varie opzioni.

Per quanto è buono l'hash - perché non testarlo con un campione dei tuoi punti effettivi? Ci sarà sempre la possibilità di collisioni, ma se esse si verificheranno o meno dipenderanno dai tuoi dati. Un modo semplice per scoprire come l'hash è esente da collisioni nel tuo caso è utilizzare Multiset da Guava - aggiungere il codice hash da ciascun punto all'insieme, quindi in seguito fornirà la frequenza di ciascun codice hash.

Per essere onesti, mi piacerebbe aspettarsi l'algoritmo di hash per essere abbastanza ragionevole per uso generale. Ma il test è sempre una buona idea se sei preoccupato.

1

Andare a questo link e cercare Java SE 6 JDK Source Code. Scarica la fonte e leggila per te. Dubito che farai meglio ma è bello essere scettico.

+0

puoi anche andare qui e utilizzare la casella di ricerca: http://grepcode.com/ – DPM

3

Il codice sorgente Java viene fornito con JDK nel file src.zip. Si noti che Point's hashCode() è definito nella sua parent, java.awt.geom.Point2D.

Se si decide l'implementazione esistente non è fino a vostri standard, si potrebbe preferire di sovrascrivere il metodo hashCode usando una classe anonima, definita "al volo":

Point myPoint = new Point() { 

    public int hashCode() { 
     // custom implementation 
    } 

}; // <-- note required semicolon 

In questo modo hai vinto' Devo creare un nuovo file.

Problemi correlati