Sé que cuando estamos pasando objetos pasamos su referencia como un valor. Pero este valor que obtiene es utilizar el método hashcode()
a la derecha (según mis pruebas, es el mismo). Dado que hashcode()
no es la dirección de la memoria y no se garantiza que obtenga valores únicos todo el tiempo, ¿pueden ocurrir cosas extrañas como colisiones al pasar objetos?¿qué pasa realmente al pasar objetos en java?
(Suponiendo que no haya hashcode()
ser anulado, es decir, devuelve el mismo valor que System.identityHashCode()
)
Tres son muchas como esta pregunta, pero no puedo encontrar un recurso relevante, que propone una discusión sobre lo que es ser ese valor aprobado y ¿cómo lo obtienes?
EDITAR: Aquí está mi prueba. El valor predeterminado toSting()
usa el hashCode()
en el interior y lo convierte en un valor hexadecimal. Entonces, cuando estamos pasando objetos, ¿este es el valor que se pasa? ¿O qué hace Java para realizar un seguimiento de todos los objetos (que se pasan) por lo que no habrá ninguna colisión de referencia ?
Object o = new Object();
System.out.println(o);
System.out.println(o.toString()); //both prints same thing - [email protected]
Como dices si la implementación predeterminada devuelve la dirección de la memoria, entonces no hay problema. Pero lo que he visto es que no está garantizado (función predeterminada) devolver la dirección de la memoria. Pero, de nuevo, ¿qué ocurre cuando hay más objetos que 2^32 y hashcode() devuelve un número entero de 32 bits? – KillBill
@ user601L 'hashcode()' no es un método infalible. Ocasionalmente hay colisiones. Pero siempre encontrará algún valor que devolverle, independientemente de si usa o no su dirección de memoria para obtenerlo. Realmente no deberías preocuparte demasiado, solo debes saber que las colisiones son posibles en los casos extremos. –
@bohemian Gracias por corregir mi gramática. Soy un idiota. –