Inline comparateur vs personnalisé comparateur en Java
Lors du tri d'une liste, il n'existe aucune différence de performance entre l'utilisation de java Comparateur en ligne (avec un anonyme intérieur de la classe) vs la mise en œuvre d'un personnel distinct de Comparaison de la classe?
1.
public class SortByErrorComparator implements Comparator<WorkflowError> {
public int compare(WorkflowError obj1, WorkflowError obj2) {
return obj1.getErrorCode().compareTo(obj2.getErrorCode());
}
}
Collections.sort(list, new SortByErrorComparator()) ;
2.
Collections.sort(list, new Comparator<WorkflowError>() {
public int compare(WorkflowError obj1, WorkflowError obj2) {
return obj1.getErrorCode().compareTo(obj2.getErrorCode());
}
});
Aussi, quand le compare()
méthode-elle être invoquée?
Vous pourriez vouloir vérifier cette réponse: stackoverflow.com/a/5468644/423991
Depuis le travail qui est fait par la même méthode: pourquoi devrait-il y avoir une différence? Et l'invocation dépend de l'algorithme de tri - chaque fois que deux éléments dans la collection doivent être comparés. Et, alors, dans une certaine mesure, de la première commande de données.
"lorsque cette méthode sera invoquée" - vous pouvez lire à propos de la comparaison de tri.
Depuis le travail qui est fait par la même méthode: pourquoi devrait-il y avoir une différence? Et l'invocation dépend de l'algorithme de tri - chaque fois que deux éléments dans la collection doivent être comparés. Et, alors, dans une certaine mesure, de la première commande de données.
"lorsque cette méthode sera invoquée" - vous pouvez lire à propos de la comparaison de tri.
OriginalL'auteur 1355 | 2015-06-23
Vous devez vous connecter pour publier un commentaire.
Il y a aussi l'option 3 - un lambda
Function
:qui devrait être d'environ 2 x plus vite, selon cette base de données de référence.
... ou (grâce à @JB Nizet) option 4:
list.sort(Comparator.comparing(WorkflowError::getErrorCode)
Pourquoi lambda devrait être plus rapide? Le post que vous avez lié dit il n'y a pas de différence de performances entre la classe anonyme et lambda.
OriginalL'auteur Bohemian
Il ne devrait pas y avoir de différence de performances entre les deux variantes, depuis anonyme classes doivent produire à l'identique de l'octet code des classes régulières (en supposant qu'ils ont le même code source). La seule différence est que ils ont un nom généré.
La
compare
méthode sera invoquée parCollections.sort
chaque fois qu'il doit comparer deux éléments de la Liste à trier.C'est un bon point. Je m'excuse de ne pas avoir le temps pour ça maintenant.
OriginalL'auteur Eran
J'ai fait un petit test et n'a trouvé aucune différence (juste quelques petites exécuter la ligne de comparaison montre une légèrement meilleure performance). C'est le code utilisé pour faire le test:
Comparateur de classe:
et la sortie est:
Si vous avez plusieurs invocation au comparateur de garder une instance de il serait utile
OriginalL'auteur Paizo