La différence entre comparable et Comparator en Java
Nov 27, 2019 pm 01:20 PMComparateur Comparable
Comparable se trouve sous le package java.lang. Il s'agit essentiellement d'un comparateur interne qui implémente Comparable peut lui-même comparer. , quant au résultat de la comparaison, il dépend de la mise en ?uvre de la méthode de comparaison naturelle compareTo.
Les valeurs de retour de compareTo sont -1, 0, 1. Si le comparateur est supérieur à l'objet comparé, 1 est renvoyé, 0 est renvoyé s'il est égal et -1 est renvoyé s'il est inférieur à l'objet comparé.
Collections.sort
et Arrays.sort
peuvent trier automatiquement les objets qui implémentent Comparable.
Recommandation de vidéo d'apprentissage en ligne gratuite?: apprentissage Java
L'exemple est le suivant, nous construisons un objet n?ud et vérifions l'utilisation de Comparable via une comparaison entre les objets n?uds.
L'implémentation de l'objet node est la suivante?:
public class Node implements Comparable<Object>{ private int num; private String name; @Override public String toString() { return "num=" + num + " name=" + name; } public Node(int num, String name) { super(); this.num = num; this.name = name; } public Node() { super(); } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int compareTo(Object o) { Node node = (Node)o; return this.num - node.getNum(); } }
Comme vous pouvez le voir, nous avons implémenté l'interface Comparable pour Node et remplacé la méthode compareTo.
Pour le tester d'abord, nous créons 10 objets Node et les ajoutons à la liste, puis mélangeons l'ordre.
public class MyTest { public static void main(String[] args) { List<Node> list = new ArrayList<Node>(); for(int i = 0;i < 10;i++) { list.add(new Node(i,"node")); } //打亂順序 Collections.shuffle(list); for (Node node : list) { System.out.println(node); } } }
Le résultat s'affiche comme suit?:
num=7 name=node num=0 name=node num=5 name=node num=9 name=node num=6 name=node num=3 name=node num=4 name=node num=8 name=node num=1 name=node num=2 name=node
Maintenant, la sortie est dans le désordre, nous utilisons ensuite Collections.sort pour la trier.
public class MyTest { public static void main(String[] args) { List<Node> list = new ArrayList<Node>(); for(int i = 0;i < 10;i++) { list.add(new Node(i,"node")); } //打亂順序 Collections.shuffle(list); Collections.sort(list); for (Node node : list) { System.out.println(node); } } }
Collections.sort compare en fait selon la définition de la méthode compareTo Nous avons précédemment défini le tri par ordre croissant de nombre. Maintenant, les résultats du tri sont les suivants?:
num=0 name=node num=1 name=node num=2 name=node num=3 name=node num=4 name=node num=5 name=node num=6 name=node num=7 name=node num=8 name=node num=9 name=node
Comparateur.
Comparator
est situé sous le package java.util
et est essentiellement un comparateur externe. Si une classe n’implémente pas Comparable en interne ou implémente Comparable mais que la méthode de comparaison ne vous convient pas, nous pouvons envisager d’implémenter Comparator. Il existe une méthode de comparaison dans l'interface Comparator et la méthode d'utilisation est la même que compareTo dans Comparable.
Nous devons passer un Comparator à la méthode de tri afin de contr?ler l'ordre de tri. Nous pouvons vérifier l'utilisation de plusieurs méthodes de tri et constater qu'elles peuvent transmettre un paramètre Comparator.
Collections.sort(List<T> list, Comparator<? super T> c); Arrays.sort(T[] a, Comparator<? super T> c);
Modifiez notre précédent objet Node et n'implémentez plus Comparable.
public class Node{ private int num; private String name; @Override public String toString() { return "num=" + num + " name=" + name; } public Node(int num, String name) { super(); this.num = num; this.name = name; } public Node() { super(); } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
On essaye de trier par ordre décroissant en passant dans un Comparator.
public class MyTest { public static void main(String[] args) { List<Node> list = new ArrayList<Node>(); for(int i = 0;i < 10;i++) { list.add(new Node(i,"node")); } //打亂順序 Collections.shuffle(list); Collections.sort(list, new Comparator<Node>() { @Override public int compare(Node o1, Node o2) { return o2.getNum()-o1.getNum(); } }); for (Node node : list) { System.out.println(node); } } }
Les résultats sont les suivants?:
num=9 name=node num=8 name=node num=7 name=node num=6 name=node num=5 name=node num=4 name=node num=3 name=node num=2 name=node num=1 name=node num=0 name=node
Comparator implémente la comparaison par ordre inverse.
Résumé
Comparable est un comparateur interne, et Comparator est un comparateur externe. Si la classe n'implémente pas l'interface Comparable mais doit être triée, nous pouvons envisager. en utilisant le comparateur. D'un autre point de vue, le couplage de l'utilisation de l'interface Comparable est supérieur à celui de Comparator, car lorsque nous devons modifier l'algorithme de comparaison, nous devons également modifier la classe d'implémentation de Comparable.
Cet article est issu de la rubrique Java Quick Start Tout le monde est invité à discuter et à apprendre ensemble !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Il existe trois méthodes courantes pour traverser la carte dans Java: 1. Utilisez l'entrée pour obtenir des clés et des valeurs en même temps, ce qui convient à la plupart des scénarios; 2. Utilisez un ensemble de touches ou des valeurs pour traverser respectivement les clés ou les valeurs; 3. Utilisez Foreach de Java8 pour simplifier la structure du code. EntrySet renvoie un ensemble de set contenant toutes les paires de valeurs de clé, et chaque boucle obtient l'objet Map.Entry, adapté à un accès fréquent aux touches et aux valeurs; Si seules les clés ou les valeurs sont nécessaires, vous pouvez appeler respectivement KeySet () ou Values (), ou vous pouvez obtenir la valeur via map.get (key) lors de la traversée des clés; Java 8 peut utiliser ForEach ((clé, valeur) - & gt

En Java, comparable est utilisé pour définir les règles de tri par défaut en interne et le comparateur est utilisé pour définir plusieurs logiques de tri à l'extérieur. 1. Comparable est une interface implémentée par la classe elle-même. Il définit l'ordre naturel en réécrivant la méthode compareto (). Il convient aux classes avec des méthodes de tri fixe et le plus couramment utilisées, telles que la cha?ne ou le rendement. 2. Comparateur est une interface fonctionnelle définie à l'extérieur, implémentée via la méthode compare (), adaptée aux situations où plusieurs méthodes de tri sont requises pour la même classe, le code source de classe ne peut pas être modifié ou la logique de tri est souvent modifiée. La différence entre les deux est que comparable ne peut définir qu'une logique de tri et doit modifier la classe elle-même, tandis que comparable

Pour faire face aux problèmes de codage des personnages en Java, la clé est de spécifier clairement le codage utilisé à chaque étape. 1. Spécifiez toujours le codage lors de la lecture et de l'écriture de texte, utilisez InputStreamReader et OutputStreamWriter et transmettez un jeu de caractères explicite pour éviter de s'appuyer sur le codage par défaut du système. 2. Assurez-vous que les deux extrémités sont cohérentes lors du traitement des cha?nes sur la limite du réseau, définissez l'en-tête de type contenu correct et spécifiez explicitement le codage avec la bibliothèque. 3. Utilisez String.getBytes () et Newstring (octet []) avec prudence, et spécifiez toujours manuellement StandardCharsets.Utf_8 pour éviter la corruption des données causée par les différences de plate-forme. En bref, par

STD :: Chrono est utilisé en C pour traiter le temps, y compris l'obtention de l'heure actuelle, la mesure du temps d'exécution, le point de fonctionnement et la durée de l'opération et le temps d'analyse de formatage. 1. Utilisez STD :: Chrono :: System_clock :: Now () pour obtenir l'heure actuelle, qui peut être convertie en une cha?ne lisible, mais l'horloge système peut ne pas être monotone; 2. Utilisez STD :: Chrono :: standard_clock pour mesurer le temps d'exécution pour assurer la monotonie, et la convertir en millisecondes, secondes et autres unités via durée_cast; 3. Point de temps (temps_point) et durée (durée) peut être interopérable, mais l'attention doit être accordée à la compatibilité des unités et à l'époque de l'horloge (époque)

HashMap implémente le stockage de paires de valeurs clés via des tables de hachage en Java, et son noyau réside dans les emplacements de données de positionnement rapidement. 1. Utilisez d'abord la méthode HashCode () de la clé pour générer une valeur de hachage et la convertir en un index de tableau via les opérations de bit; 2. Différents objets peuvent générer la même valeur de hachage, entra?nant des conflits. à l'heure actuelle, le n?ud est monté sous la forme d'une liste liée. Après JDK8, la liste liée est trop longue (longueur par défaut 8) et elle sera convertie en arbre rouge et noir pour améliorer l'efficacité; 3. Lorsque vous utilisez une classe personnalisée comme clé, les méthodes equals () et hashcode () doivent être réécrites; 4. Hashmap élargit dynamiquement la capacité. Lorsque le nombre d'éléments dépasse la capacité et se multiplie par le facteur de charge (par défaut 0,75), se développez et remaniez; 5. Hashmap n'est pas en file et concu doit être utilisé dans multithread

Les types de données JavaScript sont divisés en types primitifs et types de référence. Les types primitifs incluent la cha?ne, le nombre, le booléen, le nul, un non défini et le symbole. Les valeurs sont immuables et les copies sont copiées lors de l'attribution des valeurs, de sorte qu'elles ne se affectent pas; Les types de référence tels que les objets, les tableaux et les fonctions stockent les adresses de mémoire, et les variables pointant vers le même objet s'afferchent mutuellement. Le typeof et l'instance de OFF peuvent être utilisés pour déterminer les types, mais prêtent attention aux problèmes historiques de typeofnull. Comprendre ces deux types de différences peut aider à écrire un code plus stable et fiable.

Injava, thestatickeywordmeansamemberbelongstotheclassitelf, nottoinstances.staticvariblesaresharedacrossallinstances et accessibles withoutObjectCreation, utileforglobaltrackingorconstants.staticMethodsoperatatheClasslevel, ne peut pas accessner-staticmembers,

Reentrantlock fournit un contr?le de thread plus flexible dans Java que synchronisé. 1. Il prend en charge les verrous d'acquisition non bloquants (trylock ()), l'acquisition de verrouillage avec le délai d'attente (trylock (longue durée, timeunitUnit)) et les verrous d'attente interruptibles; 2. Permet aux écluses équitables d'éviter la faim de fil; 3. Prend en charge plusieurs variables de condition pour réaliser un mécanisme d'attente / notification plus raffiné; 4. Besoin de libérer manuellement le verrou, unlock () doit être appelé dans les blocs enfin pour éviter la fuite des ressources; 5. Il convient aux scénarios qui nécessitent un contr?le avancé de synchronisation, tels que des outils de synchronisation personnalisés ou des structures complexes simultanées, mais Synchro est toujours recommandé pour des exigences d'exclusion mutuelle simples.
