http://www.javapractices.com/topic/TopicAction.do?Id=10

The compareTo method is the sole member of the Comparable interface,
 and is not a member of Object.

Implementing Comparable allows:
    - calling Collections.sort and Collections.binarySearch
    - calling Arrays.sort and Arrays.binarySearch
    - using objects as keys in a TreeMap
    - using objects as elements in a TreeSet

The compareTo method needs to satisfy the following conditions.
 These conditions have the goal of allowing objects to be fully sorted,
 much like the sorting of a database result set on all fields.
    - anticommutation :  x.compareTo(y) is the opposite sign of y.compareTo(x)
    - exception symmetry : x.compareTo(y) throws exactly the same exceptions as
        y.compareTo(x)
    - transitivity :  if x.compareTo(y)>0 and y.compareTo(z)>0, then
        x.compareTo(z)>0  (and same for less than). IMPORTANT!!!
    - consistency with equals is highly recommended, but not required :
        x.compareTo(y)==0, if and only if x.equals(y) ;
        consistency with equals is required for ensuring sorted collections
        (such as TreeSet) are well-behaved.

        boolean x.equals(y) {
            return (x.compareTo(y) == 0);
        }

