Só uma aula antes da explicação:
O hashcode serve para podermos usar uma técnica para separar os dados no que chamamos de buckets, ou baldes de dados. Isso serve para acelerar a pesquisa por um elemento dentro de um conjunto que use esses hashes para se orientar.
Por exemplo, temos os nomes ana, bruno, camila, danilo, eduardo e fábio. O hashcode dos nomes de A a B indicam que ficarão no balde 1, C a D no balde 2, E a F no 3. Colocamos todos esses nomes do HashSet.
Agora queremos colocar mais um fábio no conjunto. Num conjunto normal, o algorítmo verificaria cada um dos nomes um a um para ver se tem um outro fábio. Iria primeiro em ana, depois bruno, camila, até chegar no último.
Com o hashcode ele verifica que fábio está no balde 3. Ele vai direto até o balde e vê que tem somente eduardo e fábio dentro.
Como o hashcode é somente uma orientação, o equals é que faz o trabalho de verdade de comparação. Por isso que equals e hashcode tem que ser um consistente com o outro, pois se colocarem um elemento no balde errado, é capaz de não acharmos ele e o elemento será duplicado.
Voltando à pergunta, o HashSet não faz ordenações, somente evita duplicatas. Pelo que o nome dele indica, ele deve usar somente o hashcode e o equals, como disse acima, para evitar duplicatas.
Do outro lado temos o TreeSet. Este usa o compareTo para se guiar até o elemento que quer encontrar, já que que ele mantém tudo ordenado. Não precisa do hashcode nem do equals, já que ele requer que o equals seja consistente com o compareTo.