Teste prático da diferença de desempenho
int qtdTeste = 20_000
Date inicio
Date fim
List<String> x = []
for (int i = 0; i < qtdTeste; i++) { x.add(i) }
inicio = new Date()
x.toSet().toList() // 9 ms!
fim = new Date()
println "${fim.time - inicio.time} ms"
inicio = new Date()
x.unique() // 10765 ms!
fim = new Date()
println "${fim.time - inicio.time} ms"
Mas atenção às diferença de comportamentos :
Diferença 1
List lista = [1.0, 1f, 1l, 1, 1.0000]
println( lista.toSet().toList() )
// Devolve [1.0, 1.0000, 1, 1, 1.0]
// Utiliza hashCode() para agrupar os objetos, e depois usa o equals() apenas dentro de cada grupo
// É parte do que o torna rápido
println( lista.unique() )
// Devolve [1.0]
// Utiliza equals() entre todos objetos
// É parte do que o torna lento
Portanto antes de fazer a "troca cega" de unique()
para toSet().toList()
analise o comportamento esperado para seus objetos!
Pois pode ser necessário ajustar a sua implementação de equals()
e hashCode()
!
Diferença 2
A implementação de unique()
mantem a ordenação da lista original.
Já toSet().toList()
não estabelece nenhum contrato em relação à ordem final dos elementos que serão devolvidos.
Posted by Bruno Vieira to ZeroGlosa (2017-06-12 12:22)