Oi Nícholas, é difícil mesmo no primeiro momento ver a diferença entre ambos. Acho que facilita pensar da seguinte forma:
O Comparable
permite que uma determinada classe diga como uma instância dela deverá ser comparada com outras instâncias dela mesma.
Por exemplo: Pessoa
é comparada com outra pessoa de acordo com a sua altura. Então a classe Pessoa
, que implementa Comparable
terá o método compareTo
verificando qual é a maior ou menor altura. Como a classe Pessoa
só pode implementar Comparable
uma vez, podemos dizer que essa é a regra oficial de comparação de Pessoa
.
Já o Comparator
permite que você crie regras extras de comparação para as classes que você possui. Por exemplo, você pode criar uma classe chamada ComparadorDeIdade
, que irá comparar a idade de pessoas para ver quem é mais velho ou mais novo. Uma outra regra "não oficial" de comparação que você pode ter é a comparação de pessoas pelo tamanho do nome. Quem tem nome mais longo vem por último.
public class ComparadorDeIdade extends Comparator<Pessoa> {
public int compareTo(Pessoa pessoa1, Pessoa pessoa2) {
// lógica para fazer a comparação
}
}
Então resumindo, o Comparable
permite que você diga uma regra de comparação para a classe que implementar essa interface, como uma espécie de regra padrão ou regra oficial, enquanto que se você quiser fugir dessa regra padrão, você pode criar suas classes comparadoras, que vão extender a classe Comparator
fazendo cada uma a sua própria regra.
Veja se ficou claro e qualquer coisa, avise.