Comparable срещу Comparator в Java
Ключова разлика между Comparable и Comparator в Java
- Сравним в Java е обект за сравняване с друг обект, докато Comparator е обект за сравняване на различни обекти от различни класове.
- Comparable осигурява
compareTo()
метод за сортиране на елементи Java, докато Comparator предоставяcompare()
метод за сортиране на елементи Java. - Сравним интерфейс присъства в
java.lang
пакет, докато интерфейсът Comparator присъства вjava.util
пакет. - Comparable предоставя една последователност за сортиране, докато Comparator предоставя множество последователности за сортиране.
- Comparable засяга оригиналния клас, докато Comparator не засяга оригиналния клас.

Тук анализирах разликата между comparable и Comparator и ще оценя изчерпателно техните плюсове и минуси.
Какво е сравнимо в Java?
Сравним in Java е обект, който се сравнява с друг обект. Помага за сортиране на списъка с персонализирани обекти. The Java.lang.Сравнимият интерфейс трябва да бъде реализиран от клас, за да се сравняват неговите екземпляри. Масив от обекти, изпълняващи сравним интерфейс, се сортира автоматично по Arrays.sort
намлява Collections.sort
методи.
Метод, използван в Comparable
Бих искал да подчертая един важен метод, който често използвам в интерфейса Comparable:
CompareTo():
Методът CompareTo() се използва за извършване на естествено сортиране на низ. Значението на естественото сортиране е редът на сортиране, който се прилага към обекта, например числов ред за сортиране на цели числа, азбучен ред за низ и т.н.
Синтаксисът на CompareTo()
метод е както следва:
int compareTo(T obj)
В горния синтаксис T означава типа обекти, които ще сравнявате.
CompareTo()
метод сравнява обекта с T obj.
Изход:
- Връща 0, ако стойностите са равни.
- Ако обектът има по-ниска стойност, този метод връща отрицателна стойност.
- Ако обектът има по-висока стойност, той връща положителна стойност.
Пример за съпоставими в Java
Следната програма на Java сравним пример показва сравнението на два знака, "a" и "b". Знакът "a" идва преди "b" по азбучен ред.
Следователно изходът е -1. Знакът „b“ идва след „a“ по азбучен ред. Следователно изходът е 1. Знаците „a“ и „b“ са еквивалентни. Следователно изходът е 0.
public class Sample_String { public static void main(String[] args) { String str_Sample = "a"; System.out.println("Compare To 'a' b is : " + str_Sample.compareTo("b")); str_Sample = "b"; System.out.println("Compare To 'b' a is : " + str_Sample.compareTo("a")); str_Sample = "b"; System.out.println("Compare To 'b' b is : " + str_Sample.compareTo("b")); } }
Продукция
Compare To 'a' b is : -1 Compare To 'b' a is : 1 Compare To 'b' b is : 0
Какво е компаратор в Java?
Сравнител in Java е обект за сравняване на различни обекти от различни класове. Интерфейсът за сравнение в Java се използва и за подреждане на обектите на дефинирани от потребителя класове. Той включва два важни интерфейсни метода за сравнение, известни като сравнение (Object obj1, Object obj2) и равно (Object element).
Метод, използван в Comparator
В моята практика често разчитам на следните критични методи на интерфейса за сравнение:
Сравнете ():
Compare()
ви позволява да поръчвате обекти. За да направите това, трябва да създадете клас, който имплементира интерфейс за сравнение. След това трябва да замените неговия метод за сравнение.
Синтаксисът на compare()
метод е както следва:
compare(Object obj1, Object obj2)
В горния синтаксис obj1 и obj2 са два обекта, които трябва да сравните с помощта на метода compare(). compare()
метод.
Изход:
- Връща отрицателно цяло число, ако първият аргумент е по-малък от втория.
- Връща нула, ако първият и вторият аргумент са равни.
- Този метод може да върне положително цяло число, в случай че първият аргумент е по-голям от втория.
Трябва да сте сигурни, че връзката е преходна. Например ((сравни (a, b)>0) && (сравни (b, c)>0)), което предполага сравнение (a, c)>0.
Пример за съпоставими в Java
По-долу Java пример за сравнение, има 6 променливи. “x”, “y”, “p”, “q”, “r” и “s”. Резултатът е -1 като стойността на “x”, 20 е по-малка от стойността на “y”, 30. Резултатът е 0, защото стойността на “p”, 40 е равна на стойността на “q”, 40 .
import java.lang.Integer; public class example { public static void main(String args[]) { int x = 20; int y = 30; // as 10 less than 20, // Output will be a value less than zero System.out.println(Integer.compare(x, y)); int p = 40; int q = 40; // as 30 equals 30, // Output will be zero System.out.println(Integer.compare(p, q)); int r = 20; int s = 7; // as 15 is greater than 8, // Output will be a value greater than zero System.out.println(Integer.compare(r, s)); } }
Изход:
-1 0 1
Равно ():
Equals()
проверява дали числовият обект е равен на обекта, който се предава като аргумент, или не.
Синтаксисът на equals()
метод е както следва:
public boolean equals(Object o)
Този метод приема два параметъра: 1) всеки обект и 2) върната стойност. Връща истина, ако предаденият аргумент не е нула и е обект от подобен тип със същата числова стойност.
Пример за метод Equals:
В примера по-долу ще сравня четирите променливи една с друга. Три променливи са от тип integer, а една е от тип short. Първият резултат е грешен, тъй като стойността на p, която е 5, не е равна на стойността на q, която е 20.
Вторият резултат е верен, защото стойността на променливите p и r е една и съща, която е 5. И накрая, изходът е false, тъй като променливите p и s имат различни присвоени стойности.
public class Test { public static void main(String args[]) { Integer p = 5; Integer q = 20; Integer r =5; Short s = 5; System.out.println(p.equals(q)); System.out.println(p.equals(r)); System.out.println(p.equals(s)); } }
Продукция
false true false
Разлики между Comparable и Comparator в Java
Често виждам объркване между Java Comparable и Comparator; ето основната разлика:
База за сравнение | Сравним | Сравняване |
---|---|---|
Начин на доставка | Сравними предоставя compareTo() метод за сортиране на елементи Java. |
Comparator предоставя compare() метод за сортиране на елементи Java. |
Пакет | Сравним интерфейс присъства в java.lang пакет. |
Интерфейс за сравнение присъства в java.util пакет. |
Логика на сортиране | Логиката на сортиране трябва да е в същия клас като обекта, който ще сортирате. | Логиката на сортиране трябва да бъде в отделни класове, за да се пишат различни сортирания въз основа на различни атрибути на обекти. |
Обект на класа | Класът, чиито обекти искате да сортирате, трябва да имплементира интерфейса Comparable. | Клас, чиито обекти искате да сортирате, не трябва да прилага интерфейс за сравнение. |
Сортиране на последователности | Той предоставя единични последователности за сортиране. | Той предоставя множество последователности за сортиране. |
Ред на сортиране | Този метод може да сортира данните според естествения ред на сортиране. | Този метод сортира данните според персонализирания ред на сортиране. |
клас | Това засяга оригиналния клас. т.е. действителният клас се променя. | Това не засяга оригиналния клас, т.е. действителният клас не се променя. |
употреба | Внедрява се често в API от Calendar, Wrapper класове, Date и Струна. |
Той е реализиран за сортиране на екземпляри на класове на трети страни. |
Прилагане | Всички класове обвивки и класове низове реализират сравними интерфейси. | Единствените внедрени класове на Comparator са Collator и RuleBasedColator. |
Най-добри практики при използване на Comparator и Comparable в Java
- Използвайте сравним интерфейс, когато сравнението е стандартно за конкретния клас.
- Можете да използвате ламбда с компаратор.
- Много от наличните основни класове реализират сравним интерфейс.
- Възможно е да използвате TreeSet и TreeMap, докато сортирате Set или Map.
- -
compareTo()
методът работи както с компаратор, така и със сравним. - Използвайте интерфейса за сравнение само когато имате нужда от повече гъвкавост.
- -
compareTo()
метод ще върне положително цяло число, ако първият обект е по-голям от другия, отрицателно, ако е по-нисък, и нула, ако и двата са еднакви.
Как да избирате между съпоставимо и сравнително
В заключение моят практически опит показва, че използването на Comparable и Comparator в Java значително повишава контрола, който имаме върху сортирането на данни, подобрявайки както производителността, така и функционалността.