37 votes

Code de hachage de ArrayList qui se contient comme élément

Peut-on trouver le hashcode d'un list qui se contient comme element ?

Je sais que c'est une mauvaise pratique, mais c'est ce que l'intervieweur a demandé.

Lorsque j'ai exécuté le code suivant, il lance un StackOverflowError :

 public class Main {
    public static void main(String args[]) {
        ArrayList<ArrayList> a = new ArrayList();
        a.add(a);
        a.hashCode();
    }
}

Maintenant, j'ai deux questions:

  1. Pourquoi y a-t-il un StackOverflowError ?
  2. Est-il possible de trouver le code de hachage de cette manière?

23voto

Ravindra Ranwala Points 5765

Consultez la mise en œuvre du squelette de l' hashCode méthode en AbstractList classe.

 public int hashCode() {
    int hashCode = 1;
    for (E e : this)
        hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
    return hashCode;
}

Pour chaque élément de la liste, cela appelle hashCode . Dans votre cas, la liste a elle-même comme seul élément. Maintenant, cet appel ne se termine jamais. La méthode s'appelle elle-même de manière récursive et la récursivité continue à s'enrouler jusqu'à ce qu'elle rencontre le StackOverflowError . Vous ne pouvez donc pas trouver le hashCode cette façon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X