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?
risposta
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).
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. –
Grazie !!!!!!!!! – Tim
@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
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.
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.
- 1. come funziona il metodo hashCode() di java?
- 2. Java librerie della piattaforma HashCode
- 3. Come verificare se il nome della classe è valido?
- 4. Come viene implementato il metodo hashCode() nella classe Object?
- 5. Quando utilizzare il metodo System.identityhashcode() e hashcode()?
- 6. Cosa c'è dietro il metodo hashCode() per String in Java?
- 7. Qual è lo scopo del metodo hashcode in java?
- 8. L'override del metodo hashCode() di Java non è necessario se non si utilizza hashmap o hashset
- 9. Classe Point e Line in C++?
- 10. In java, come è possibile distruggere un'istanza di una classe da un metodo all'interno della classe
- 11. Java o qualsiasi altra lingua: quale metodo/classe ha invocato il mio?
- 12. Implementazione HashCode dell'array Java
- 13. dovrei chiamare [super superMethod] dopo il mio codice o prima?
- 14. Metodo remoto non valido in java
- 15. alias classe o un metodo in Java
- 16. Perché dovrei (o non dovrei) scrivere il mio nuovo sito web in HTML 5 e CSS3?
- 17. Java "serializzazione del metodo" della classe anonima
- 18. Perché il mio metodo di overriding toString() deve essere pubblico?
- 19. Come dovrei denominare il mio file di classe PHP?
- 20. Doctrine2 - "classe" non è un'entità valido o mappato super classe
- 21. Java: dovrei usare float o float?
- 22. Quale metodo dovrei usare per avviare manualmente il mio AngularJS?
- 23. Com'è compilato il metodo toString() della classe Object in java?
- 24. Qual è la differenza tra `##` e `hashCode`?
- 25. Come chiamare il metodo astratto della classe in java
- 26. Perché dovrei eseguire l'override di hashCode() quando sovrascrivo il metodo equals()?
- 27. Qual è l'uso di hashcode in Java?
- 28. Deterministic hashCode() di java?
- 29. Come dovrei configurare il mio Solr filterCache, firstSearcher e newSearcher?
- 30. Perché è necessario eseguire l'override di hashcode e equivale al metodo della chiave per Hashmap?
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
La fonte si trova in 'src.zip' all'interno della directory JDK. –
Puoi anche google> sorgente java awt point e il primo risultato di ricerca sarà probabilmente il codice sorgente completo per la classe :-) – Yuval