java - HashSet vs ArrayList contiene rendimiento
(3)
El conjunto dará un rendimiento mucho mejor ( O(n)
vs O(n^2)
para la lista), y eso es normal porque evitar el duplicado es el verdadero propósito de un conjunto.
Contiene para un HashSet
es O(1)
comparación con O(n)
para una lista, por lo tanto, nunca debe usar una lista si a menudo necesita ejecutar contains
.
Al procesar grandes cantidades de datos, a menudo me encuentro haciendo lo siguiente:
HashSet<String> set = new HashSet<String> ();
//Adding elements to the set
ArrayList<String> list = new ArrayList<String> (set);
Algo así como "descargar" el contenido del conjunto en la lista. Normalmente hago esto porque los elementos que agrego a menudo contienen duplicados que quiero eliminar, y esto parece una manera fácil de eliminarlos.
Con solo ese objetivo en mente (evitando duplicados) también podría escribir:
ArrayList<String> list = new ArrayList<String> ();
// Processing here
if (! list.contains(element)) list.add(element);
//More processing here
Y, por lo tanto, no es necesario "dumping" el conjunto en la lista. Sin embargo, estaría haciendo un pequeño control antes de insertar cada elemento (que supongo que también lo hace HashSet)
¿Alguna de las dos posibilidades es claramente más eficiente?
Si no necesita una lista, solo usaría un conjunto y esta es la colección natural para usar si el orden no importa y quiere ignorar los duplicados.
Puede hacer ambas cosas; necesita una Lista sin duplicados.
private Set<String> set = new HashSet<>();
private List<String> list = new ArrayList<>();
public void add(String str) {
if (set.add(str))
list.add(str);
}
De esta forma, la lista solo contendrá valores únicos, se conservará el orden de inserción original y la operación será O (1).
ArrayList
usa una matriz para almacenar los datos. ArrayList.contains
tendrá una complejidad O (n). Entonces, esencialmente, buscar en conjunto una y otra vez tendrá O(n^2)
complejidad.
Mientras que HashSet
usa un mecanismo de hash para almacenar los elementos en sus respectivos cubos. La operación de HashSet
será más rápida para una larga lista de valores. Alcanzará el elemento en O(1)
.