Podemos encontrar la hashcode
de una list
que contiene a sí misma como element
?
Sé que esto es una mala práctica, pero esto es lo preguntó el entrevistador.
Cuando me encontré con el siguiente código que lanza un StackOverflowError
:
public class Main {
public static void main(String args[]) {
ArrayList<ArrayList> a = new ArrayList();
a.add(a);
a.hashCode();
}
}
Ahora, aquí tengo dos preguntas:
- ¿Por qué hay una
StackOverflowError
? - ¿Es posible encontrar el código hash de esta manera?
El código hash para que cumplan List
las implementaciones se ha especificado en la interfaz :
Devuelve el valor de código hash de esta lista. El código hash de una lista se define como el resultado del siguiente cálculo:
int hashCode = 1; for (E e : list) hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
Esto asegura que
list1.equals(list2)
implica quelist1.hashCode()==list2.hashCode()
para cualquier par de listas,list1
ylist2
, como es requerido por el contrato general deObject.hashCode()
.
Esto no requiere que la aplicación se ve exactamente igual que (ver cómo calcular el código hash de una corriente de la misma manera como List.hashCode () de una alternativa), pero el código hash correcto para una lista única que contiene en sí sería ser un número para el cual x == 31 + x
debe ser true
, en otras palabras, es imposible calcular un número conforme.