Duvida com Codigo

ola Amigos do forum, estou com mais uma duvida que gostaria de compartilhar, vejam por favor o codigo abaixo:

import java.util.*;
class ComparatorCarro implements Comparator{
	public int compare(Object o1, Object o2){
		return ((Carro)o1).chassi.compareTo(((Carro)o2).chassi);
	}
}
class Carro{
	Integer chassi;
	String modelo;
	Carro(int chassi, String modelo){
		this.chassi = chassi;
		this.modelo = modelo;
	}
	public String toString(){
		return "Chassi: " + chassi + "/Modelo: " + modelo;
	}
}
public class Teste {
	public static void main(String[] args) {
		TreeSet s = new TreeSet(new ComparatorCarro());
		s.add(new Carro(123,"Popular"));
		s.add(new Carro(124,"Luxo"));
		s.add(new Carro(123,"Medio"));
		s.add(new Carro(129,"Super"));
		s.add(new Carro(1234,"Mega"));
		s.add(new Carro(150,"Luxuoso"));
		System.out.println(s);
	}

}

A classificacao e feita normalmente, o codigo compila e executa, porem a minha duvida e: Por que tenho que colocar no codigo os metodos equals e hashCode se o resultado e o mesmo? Todos os exemplos do livro usam estes metodos mas nao entendo exatamente porque, conto com a ajuda dos amigos, obrigado.

Amigo eu entendo pouco do assunto, não sei se minha resposta está correta, mas eu acho que:

equals: realiza comparação simples, mas não otimizada.

hashCode: E mais otimizado, melhora a performace, quando existe muitas comparações, em grandes sistemas isto pode fazer muita diferença.

Agora o porquê do uso, eu imagino que ele faz uso dos dois para realizar uma comparação de performace superior.

Olá EngTI,

Cara, o que você falou eu acho que tem a ver sim, talvez em pesquisas em sistemas maiores ele seja melhor utilizado, é que questões de exame de certificação na verdade são meio esquisitas e fazem a gente pensar em porque usaria tal recurso. Mas valeu pela sua ajuda, vou manter aberto o tópico pra ver as demais respostas, abraço.

Sidney:

a) Implemente equals e hashCode se você pretende inserir um objeto dessa classe em alguma coleção como um HashMap, Hashtable, HashSet, LinkedHashSet, LinkedHashMap, ConcurrentHashMap etc.
b) Use um Comparator, ou então implemente a interface Comparable, se você pretende inserir um objeto dessa classe em alguma coleção como TreeSet, TreeMap, ConcurrentSkipListMap, ConcurrentSkipListSet e outras que exigem elementos ordenados.

Opa entanglement,

Agora ficou mais claro, estou testando muito as possibilidades neste assunto pra principalmente entender o porque das coisas, afinal pra trabalhar acho que isso é o mais importante né, obrigado pela ajuda. Abraço.