Comparable vs Comparator

Comparable vs Comparator !!!

There are many articles available on internet for this. But still I would write something about it.

What when and why?

A Comparable class is a class, which can be compared with the objects of its own type. Let us take an example of a book.

public class Book implements Comparable {
String title;
int isbn;

Book(String title, int isbn) {
this.title = title;
this.isbn = isbn;
/* This method will be the default method used to sort Book objects in a list or Array */
public int compareTo(Object object) {
// It should throw NullPointerException if object passed is null
if (object==null)
throw new NullPointerException("compareTo: Argument passed is null");
Book other = (Book) object;
if (this.title.equals(other.title)) {
return this.isbn - other.isbn;
return this.title.compareTo(other.title);

The moment your class implements Comparable, you can then use

List list = new LinkedList();
list.add(new Book("Patterns", 12345));
list.add(new Book("Apples", 34567));
list.add(new Book("Examples", 23456));


Using this you can sort your list.

But what if now, you want to add or use another sorting criteria defined in Book class… Here comes the need of Comparator.
There are two ways listed here to use the Comparator class.

First method

We create a anonymous class that implements Comparator and overrides compare method.

Collections.sort(list, new Comparator() {
public int compare(Object obj1, Object obj2) {
if(obj1 == null || obj2 == null){
throw new NullPointerException("compareTo: Argument passed is null");
Book book1 = (Book) obj1;
Book book2 = (Book) obj2;
return book1.isbn - book2.isbn;

Second Method

You define a class that implements Comparator like as below.

class BookComparator implements Comparator{

public int compare(Object book1, Object book2){

int b1= ((Book)book1).isbn;
int b2= ((Book)book2).isbn;

if(b1> b2)
return 1;
else if(b1< b2)
return -1;
return 0;


And use this newly defined comparator class as an argument to Collections.sort.

Arrays.sort(list, new BookComparator ());

Good reasons to use Comparator interface

  • I do not have permissions to edit the Book class.
  • Book class already implements Comparable interface, but I want to sort the objects using a different criteria
  • I want to have more than 1 criterias to sort the objects in different orders.

Reasons to implement Comparable interface

  • I want my class to have a default sorting criteria that can be used by the users of my class
  • Usually, one would like to sort the objects based on primary key

Few good links on this topic are here

This entry was posted in Java, Server Side Programming and tagged , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s