Interview question
What is the difference between Comparable and Comparator in Java? Java में Comparable और Comparator में क्या अंतर है?
Answer
| Aspect | Comparable | Comparator |
|---|---|---|
| Package | java.lang | java.util |
| Method | compareTo(Object o) | compare(Object o1, Object o2) |
| Sorting logic location | Inside the class being sorted | Separate class or lambda |
| Number of orderings | Only ONE natural ordering per class | MULTIPLE different orderings possible |
// Comparable - defines natural ordering INSIDE the class
class Employee implements Comparable<Employee> {
String name;
int age;
Employee(String name, int age) { this.name = name; this.age = age; }
@Override
public int compareTo(Employee other) {
return this.age - other.age; // natural order = by age
}
}
List<Employee> employees = new ArrayList<>();
employees.add(new Employee('John', 30));
employees.add(new Employee('Jane', 25));
Collections.sort(employees); // uses compareTo() - sorted by age
// Comparator - defines ordering OUTSIDE the class, multiple possible
Comparator<Employee> byName = (e1, e2) -> e1.name.compareTo(e2.name);
Comparator<Employee> byAgeDesc = (e1, e2) -> e2.age - e1.age;
employees.sort(byName); // sort by name
employees.sort(byAgeDesc); // sort by age, descending
// Chaining comparators (Java 8+)
Comparator<Employee> byNameThenAge = Comparator
.comparing((Employee e) -> e.name)
.thenComparing(e -> e.age);| पहलू | Comparable | Comparator |
|---|---|---|
| Package | java.lang | java.util |
| Method | compareTo() | compare() |
| Sorting logic कहां | Class के अंदर | अलग class/lambda |
| Orderings की संख्या | सिर्फ एक natural ordering | Multiple orderings संभव |
class Employee implements Comparable<Employee> {
String name;
int age;
Employee(String name, int age) { this.name = name; this.age = age; }
@Override
public int compareTo(Employee other) {
return this.age - other.age;
}
}
List<Employee> employees = new ArrayList<>();
employees.add(new Employee('John', 30));
employees.add(new Employee('Jane', 25));
Collections.sort(employees); // age से sort
Comparator<Employee> byName = (e1, e2) -> e1.name.compareTo(e2.name);
Comparator<Employee> byAgeDesc = (e1, e2) -> e2.age - e1.age;
employees.sort(byName);
employees.sort(byAgeDesc);
Comparator<Employee> byNameThenAge = Comparator
.comparing((Employee e) -> e.name)
.thenComparing(e -> e.age);Was this answer clear?