Here are some of the
common differences, which is worth remembering to
answer this question if asked during a telephonic or face to face interview:
1) Comparator in Java is defined in java.util package while Comparable interface in Java is
defined in java.lang package, which very much says that Comparator should be used as an
utility to sort objects which Comparable should be provided by default.
2) Comparator interface in Java has
method public int compare (Object o1, Object o2) which returns a negative
integer, zero, or a positive integer as the first argument is less than, equal
to, or greater than the second. While Comparable interface has method public int
compareTo(Object o) which returns a negative integer, zero, or a positive integer as
this object is less than, equal to, or greater than the specified object.
3) If you see then
logical difference between these two is Comparator in Java compare two objects provided to him, while Comparable interface compares
"this" reference with the
object specified. I have shared lot of tips on how
to override compareTo() method and avoid some common mistakes programmer
makes while implementing Comparable interface.
4) Comparable in Java is used to
implement natural ordering of object.
In Java API String, Date and wrapper classes implements Comparable interface.Its always
good practice to override compareTo() for value objects.
5) If any class implement
Comparable interface in Java then
collection of that object either List or Array can be sorted
automatically by using Collections.sort() or Arrays.sort() method and object will be
sorted based on there natural order defined by CompareTo method.
6) Objects which
implement Comparable in Java
can be used as keys in a SortedMap like TreeMap
or elements in a SortedSet for example TreeSet, without specifying any Comparator.
These were combination of
some theoretical and practical differences between Comparator and Comparator
interface in Java. It does help you to decide when to use Comparator vs
Comparable but things will be more clear when we some best practices around
using both of these interfaces. Now let’s see an example of Comparator in Java:
Example of using Comparator and Comparable in Java
So in Summary if you want
to sort objects based on natural order then use Comparable in Java and if you want
to sort on some other attribute of object then use Comparator in Java. Now to
understand these concepts lets see an example or real life coding:
1) There is class called Person, sort the Person based on person_id,
which is primary key in database
2) Sort the Person based on there name.
For a Person class, sorting based on person_id can be treated as natural order sorting and sorting based
on name field can be implemented using Comparator interface. To sort based on person_id we need to implement compareTo() method.
public class
Person implements Comparable {
private int person_id;
private String name;
/**
* Compare current person with specified person
* return zero if person_id for both person is same
* return negative if current person_id is less than specified one
* return positive if specified person_id is greater than specified one
*/
@Override
public int compareTo(Object o) {
Person p = (Person) o;
return this.person_id - o.person_id ;
}
….
}
private int person_id;
private String name;
/**
* Compare current person with specified person
* return zero if person_id for both person is same
* return negative if current person_id is less than specified one
* return positive if specified person_id is greater than specified one
*/
@Override
public int compareTo(Object o) {
Person p = (Person) o;
return this.person_id - o.person_id ;
}
….
}