2012-02-12 7 views
5

¿Hay alguna manera de ver realmente el código fuente de las clases estándar de Java por cierto? Estoy creando una tabla hash de puntos (HashSet<Point>) y quiero asegurarme de que funcionará bien, pero no puedo ver cómo se ve en realidad el método hashCode() de Point, así que no sé qué tan bueno es realmente es. ¿Alguien puede ayudarme? ¿Debo anularlo? Y si es así, ¿hay una manera fácil de hacerlo sin crear un archivo/clase java completamente nuevo?Java - ¿El método hashCode() de la clase Point es bueno, o debería anularlo y escribir el mío?

+0

No sé acerca de otros IDEs, pero en Eclipse puede adjuntar el código fuente a la biblioteca de Java. Ventana -> Preferencias -> Java -> JRE instalados -> Seleccione los JAR -> Archivo adjunto de origen. Navega hacia el src.zip que obtiene con su JDK (o siguiendo el enlace de Jon Skeet) y voilà. – Jeffrey

+0

La fuente se encuentra en 'src.zip' dentro de su directorio JDK. –

+0

También puede buscar en google> java awt point source y el primer resultado de búsqueda probablemente sea el código fuente completo de la clase :-) – Yuval

Respuesta

8

Si está buscando hashCode() de java.awt.Point, se define en 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))); 
} 

Tenga en cuenta que la cuestión "Va a desmenuzar bien?" es difícil de responder, depende principalmente del patrón de uso.

Se puede acceder al código fuente de casi todos los "clases Java estándar", simplemente buscar el archivo src.zip en el directorio de instalación del JDK (o utilizar un IDE como Eclipse/NetBeans y haga clic en F3 en el nombre de la clase).

+1

Por cierto, esto no es una mala implementación del código hash, como va. No es lo que yo llamaría seguro contra un ataque deliberado, pero es perfectamente bueno para el uso diario. –

+0

¡¡¡Gracias !!!!!!!!! – Tim

+0

@Louis Wasserman: Ten en cuenta que no dije que era malo, me refería a la pregunta de Tim: "Quiero asegurarme de que funcionará bien" _. Creo que uno no debe tocar el comportamiento predefinido, en general deberían serlo. En mi experiencia, después del perfilado siempre se reduce a alguna otra parte del código que causa el cuello de botella. – rlegendi

3

¿Hay alguna manera de ver realmente el código fuente de las clases estándar de Java por cierto?

Sí - Creo que generalmente viene con el JDK, en un archivo src.zip dentro de su directorio JDK. Si no es así, la forma de obtenerlo dependerá de la versión de Java que esté utilizando. La fuente completa JDK 6 está disponible here por ejemplo, o JDK 7 tiene un source code download page por separado con varias opciones.

En cuanto a qué tan bueno es el hash, ¿por qué no probarlo con una muestra de su puntos reales? Siempre habrá la posibilidad de colisiones, pero si realmente ocurren o no dependerá de sus datos. Una manera fácil de averiguar qué tan libre de colisiones tiene el hash en su caso es usar Multiset desde Guava - agregue el código hash de cada punto al conjunto, y luego eso básicamente le dará la frecuencia de cada código hash.

Para ser honesto, me gustaría esperar que el algoritmo hash sea bastante razonable para uso general. Pero las pruebas siempre son una buena idea si estás preocupado.

1

Vaya a este link y busque Java SE 6 JDK Source Code. Descargue la fuente y léala usted mismo. Dudo que lo hagas mejor, pero es bueno ser escéptico.

+0

puede ir aquí también y usar el cuadro de búsqueda: http://grepcode.com/ – DPM

3

El código fuente de Java viene con el JDK en el archivo src.zip. Tenga en cuenta que Point 's hashCode() se define en su principal, java.awt.geom.Point2D.

Si se decide la implementación existente no es hasta sus estándares, es posible que prefiera reemplazar el método hashCode usando una clase anónima, que se define "sobre la marcha":

Point myPoint = new Point() { 

    public int hashCode() { 
     // custom implementation 
    } 

}; // <-- note required semicolon 

De esta manera usted ganó' t tiene que crear un nuevo archivo.

Cuestiones relacionadas