Excelente pergunta.
Vamos fazer um teste? Vamos criar um array de Aulas, quanto maior melhor.
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Main {
public static void main(String[] args) {
ArrayList<Aula> aulas1 = new ArrayList<>(), aulas2 = new ArrayList<>();
for(int i = 0; i < 1000; i++) {
int numeroGerado = (int) ( Math.random() * 1000 );
Aula a = new Aula(numeroGerado);
aulas1.add( a );
aulas2.add( a );
}
// Arrays.copyOf(original, newLength), podiamos copiar um array em função do outro.
// imprimindo os dois arrays
System.out.println(aulas1);
System.out.println(aulas2);
System.out.println();
long comecouMillis = System.currentTimeMillis();
Collections.sort(aulas1);
long tempoCollectionsSort = System.currentTimeMillis() - comecouMillis;
System.out.println("Tempo do Collections.sort(aulas) = " + tempoCollectionsSort + "ms.");
comecouMillis = System.currentTimeMillis();
aulas2.sort(Comparator.comparing(Aula::getTempo));
long tempoComparatorComparing = System.currentTimeMillis() - comecouMillis;
System.out.println("Tempo do Comparator.comparing(Aula::getTempo()) = " + tempoComparatorComparing + "ms.");
// imprimindo os dois arrays ordenados
System.out.println(aulas1);
System.out.println(aulas2);
}
}
class Aula implements Comparable<Aula> {
private int tempo;
public Aula(int tempo) {
this.tempo = tempo;
}
public int getTempo() {
return tempo;
}
public String toString() {
return tempo + "";
}
@Override
public int compareTo(Aula o) {
return Integer.compare(this.tempo, o.getTempo());
}
}
Execute várias vezes. Altere o número de itens do array no laço "for." Será que era previsível o resultado que obtém? Inspecione a implementação dos métodos Collection.sort e Comparator. comparing e veja quantas verificações extra são feitas em um ou outro.
Quanto mais rápido um do outro é no seu computador. A mim dá uma diferença entre 5 a 10x mais rápida uma solução da outra!!!