Java 8 hashmap Internals

Antony Vimal Raj:

Eu tenho ido através da implementação de Java 8 HashMap e chegou com abaixo dúvidas. Por favor me ajude a esclarecer-lhes:

  1. Eu li em um artigo que diz que, nós com o mesmo código hash será adicionado no mesmo balde como uma lista ligada. Ele diz que o novo nó a esta lista ligada será adicionado na cabeça insteadof cauda para evitar a passagem de cauda. Mas quando eu ver o código fonte, novo nó está sendo adicionado na cauda. Isso está correto?
  2. Eu não entendia completamente este MIN_TREEIFY_CAPACITY variável. É como depois de tanto contagem, mapa inteiro será convertido em árvore (de matriz para árvore)?
Peter Lawrey:

Mas quando eu ver o código fonte, novo nó está sendo adicionado na cauda. Isso está correto?

Ele é adicionado à cabeça, em versões mais antigas. No entanto, muitas mudanças foram feitas em Java 8 que faz.

class A {
    static class SameHash {
        final int n;

        SameHash(int n) {
            this.n = n;
        }

        @Override
        public int hashCode() {
            return 1;
        }

        @Override
        public String toString() {
            return "SameHash{" +
                    "n=" + n +
                    '}';
        }
    }

    public static void main(String[] args) {
        HashSet<SameHash> set = new HashSet<>();
        for (int i = 1; i <= 4; i++)
            set.add(new SameHash(i));
        System.out.println(set);
    }
}

impressões

[SameHash{n=1}, SameHash{n=2}, SameHash{n=3}, SameHash{n=4}]

NOTA: As chaves podem ter diferentes hashcodes mas pode acabar no mesmo balde.

Eu não entendia completamente este MIN_TREEIFY_CAPACITY variável. É como depois de tanto contagem, mapa inteiro será convertido em árvore (de matriz para árvore)?

Após essa contagem, o balde é convertido em uma árvore desde que a chave é Comparable

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=184890&siteId=1
Recomendado
Clasificación