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

O impacto do uso de cada um

Queria saber se a diferença nos uso do HashSet é tão impactante e importante assim na velocidade em casos reais. o meu console imprimiu isso:

Tempo gasto(ArrayList): 2645
Inserção: 8
Busca: 2637
-------------------------------------------------
Tempo gasto(HashSet): 2572
Inserção: 11
Busca: 2561

vantagem de 76 para o HashSet na busca com 100000 elementos EDIT: executando denovo vi que a diferença na maioria das runs é de 300 pra cima

o codigo (meio bagunçado) foi esse:

package br.com.alura;

import java.util.ArrayList;
import java.util.Collection;

public class TestaPerformanceSet {

    public static void main(String[] args) {

        Collection<Integer> numeros = new ArrayList<Integer>();

        long inicio = System.currentTimeMillis();

        long II = System.currentTimeMillis();
        for (int i = 1; i <= 100000; i++) {
            numeros.add(i);
        }
        long FI = System.currentTimeMillis();

        long IB = System.currentTimeMillis();
        for (Integer numero : numeros) {
            numeros.contains(numero);
        }
        long FB = System.currentTimeMillis();

        long fim = System.currentTimeMillis();

        long tempoDeExecucao = fim - inicio;
        long tempoDeInsercao = FI - II;
        long tempoDeBusca = FB - IB;

        System.out.println("Tempo gasto(ArrayList): " + tempoDeExecucao);
        System.out.println("Inserção: " + tempoDeInsercao);
        System.out.println("Busca: " + tempoDeBusca);

        System.out.println("-------------------------------------------------");

        Collection<Integer> numeros2 = new ArrayList<Integer>();

        long inicio2 = System.currentTimeMillis();

        long II2 = System.currentTimeMillis();
        for (int i = 1; i <= 100000; i++) {
            numeros2.add(i);
        }
        long FI2 = System.currentTimeMillis();

        long IB2 = System.currentTimeMillis();
        for (Integer numero : numeros2) {
            numeros2.contains(numero);
        }
        long FB2 = System.currentTimeMillis();

        long fim2 = System.currentTimeMillis();

        long tempoDeExecucao2 = fim2 - inicio2;
        long tempoDeInsercao2 = FI2 - II2;
        long tempoDeBusca2 = FB2 - IB2;

        System.out.println("Tempo gasto(HashSet): " + tempoDeExecucao2);
        System.out.println("Inserção: " + tempoDeInsercao2);
        System.out.println("Busca: " + tempoDeBusca2);

    }

}
1 resposta
solução!

O HashSet é mais rápido pois ele cria grupos para organizar os dados.

Imagine o seguinte cenário:

Eu te dou 10.000 papéis, cada um contendo um nome, e peço pra vc ir guardando. Você vai colocando todos os papéis, um após o outro. Depois eu peço pra vc produrar o nome "João". Você vai ter que procurar entre os 10.000 papéis até achar o "João", e talvez ele nem exista na sua lista. Isso é o que o ArrayList propõe.

Já o HashSet cria conjuntos (estes conjuntos são definidos por um cálculo contindo no método hashCode de cada Classe). Vamos supor, no nosso exemplo, que ele crie classes pela primeira letra de cada nome. Então, quando eu terminar de te dar os 10.000 papeis, você vai ter 26 conjuntos de nomes. E quando eu pedir pra vc procurar por "João", vc vai levar muito menos tempo, pois só vai precisar procurar no conjunto "J".