2010-09-17 14 views
10

tengo curiosidad por qué Object.toString() vuelve este:¿Por qué Object.toString() devuelve una representación hexadecimal de hashCode por defecto?

return getClass().getName() + "@" + Integer.toHexString(hashCode()); 

Frente a esto:

return getClass().getName() + "@" + hashCode(); 

¿Qué beneficios mostrando el código hash como un hexagonal en lugar de un número decimal que compran?

+0

Muy relacionado con http://stackoverflow.com/questions/29140402/how-do-i-print-my-java-object-without-getting-sometype2f92e0f4 – Raedwald

Respuesta

9

Object.hashCode solían calcularse based on a memory location where the object is located. Las ubicaciones de memoria se muestran casi universalmente como hexadecimales.

El valor de retorno predeterminado de toString no está tan interesado en el código de hash, sino más bien en una forma única de identificar el objeto para la depuración, y el código de hash sirve para identificarlo (de hecho , la combinación de nombre de clase + dirección de memoria es realmente única, y aunque no se garantiza que un código hash sea único, a menudo se acerca).

+12

estrictamente hablando 'Object.hashCode()', devuelve un número que * para algunas JVM * se basa en la ubicación del objeto * en el momento en que se llama por primera vez al método *. El GC puede reubicar el objeto, pero el 'hashCode' debe permanecer igual. –

+4

¿Hay ** máquinas JV ** para las que devuelva la ubicación de la memoria? – Raedwald

+3

La afirmación de que "' Object.hashCode' devuelve por defecto una dirección de memoria "es incorrecta para todas las JVM de Sun/Oracle lanzadas en la última década, c.f. http://stackoverflow.com/questions/16105420/java-object-hashcode-address-or-random/16105878#16105878. ¿Tenía otras implementaciones de JVM en mente o quiso decir que hashCode ** solía ** devolver una ubicación de memoria? – meriton

9

No me gusta la respuesta aceptada. Aquí está mi respuesta.

Respuesta corta: porque hex es más fácil de memorizar, ya que un número expresado en hexadecimal es más corto y tiene una variedad de caracteres mayor que el mismo número expresado en decimal.

Respuesta más larga: No va a utilizar el código hash para hacer aritmética con él en la cabeza, por lo que realmente no necesita que esté en decimales. Por otro lado, es muy probable que lo vaya a utilizar de la única manera en que está destinado a ser utilizado, es decir, para indicar si dos códigos hash se refieren al mismo objeto o a diferentes objetos. En otras palabras, lo usará como un identificador único o mnemonic para un objeto. Por lo tanto, el hecho de que sea un número es irrelevante; también podrías pensar en ello como una cadena hash. Bueno, sucede que a nuestros cerebros les resulta mucho más fácil retener (para fines de comparación) cadenas cortas que constan de 16 caracteres diferentes, que cadenas más largas que constan de solo 10 caracteres diferentes.

+3

En una nota relacionada, si los números se muestran en decimales, las personas pueden ser más propensas a esperar que "signifiquen" algo. Por ejemplo, "Fnord # 194" suena mucho más como el 194 ° Fnord que "Fnord @ 159C8EA5". Desde un punto de vista mnemotécnico, otras codificaciones alfanuméricas podrían haber sido más cortas y más fáciles de distinguir, pero creo que Java quería evitar cualquier posibilidad de producir secuencias de letras que pudieran considerarse ofensivas. – supercat

+0

Lo usamos solo para este propósito. Necesito saber (en tormenta) cuál persistir del 5 que tenemos persiste en la cantidad. Entonces en nuestro registro usamos esto para ordenar en una sola instancia de un perno. – markthegrea

Cuestiones relacionadas