Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Onde está escrito a diferença entre usar contains com List vs Set?

Como saberia, se o professor não falasse na aula, que "se estamos verificando se um elemento pertence a uma implementação de List, só precisamos reescrever o método equals(), já que o método .contains() de List só utiliza o equals para comparação." Enquanto se estivermos utilizando Set precisamos reescrever além do equals o hashcode(), pois o método .contains() de Set utiliza tb o hashcode()?

Minha dúvida é: quando eu estiver programando sozinho, minha referência é o Javadoc. Verifiquei no Javadoc e o método contains() de Set e List dizem exatamente a mesma coisa. De onde veio essa informação complementar dada pelo professor?

Coisas assim nos fazem perder muito tempo no dia-a-dia. No cenário onde eu estaria utilizando um Set, sobrescreveria o método equals como especifica o Javadoc e mesmo assim na comparação não funcionaria.

Entende minha questão?

1 resposta
solução!

Fala Daniel, tudo bem?

Ótima pergunta. As implementações de List utilizam apenas o equals, mas as implementações de Set podem utilizar o hashcode. Se navegarmos dentro de uma implementação do método contains de Set e compararmos com o de List:

HashSet

    public boolean contains(Object var1) {
        return this.map.containsKey(var1); // vai chamar o containsKey de hashMap
    }

HashMap

 public boolean containsKey(Object var1) {
        return this.getNode(hash(var1), var1) != null; // chama o método hash
    }

    static final int hash(Object var0) {
        int var1;
        return var0 == null ? 0 : (var1 = var0.hashCode()) ^ var1 >>> 16; // chama o hashCode()
    }

ArrayList

    public int indexOf(Object var1) {
        int var2;
        if (var1 == null) {
            for(var2 = 0; var2 < this.size; ++var2) {
                if (this.elementData[var2] == null) {
                    return var2;
                }
            }
        } else {
            for(var2 = 0; var2 < this.size; ++var2) {
                if (var1.equals(this.elementData[var2])) { // chama o equals()
                    return var2;
                }
            }
        }

        return -1;
    }

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software