Comparable vs Comparator
Comparable<T> (via compareTo) defines a class's single "natural" ordering, implemented by the class
itself. Comparator<T> defines an external, swappable ordering, and can be composed fluently:
Comparator.comparing(...).thenComparing(...), .reversed(), etc. — the idiomatic way to sort by multiple
criteria without writing a manual compareTo chain.
import java.util.*;
List<String> names = new ArrayList<>(List.of("banana", "apple", "Cherry"));
names.sort(Comparator.naturalOrder());
System.out.println("natural order (case-sensitive, capitals sort first): " + names);
names.sort(Comparator.comparing(String::length).thenComparing(Comparator.naturalOrder()));
System.out.println("by length, then natural order as tiebreak: " + names);
names.sort(Comparator.comparing(String::length).reversed());
System.out.println("by length descending: " + names);