Equals e compareTo

Olá Pessoal! estudando bateu uma dúvida básica. Qual a diferença entre equals e compareTo? eu vi alguns exemplos mas não entendi direito, se alguém puder ajudar eu agradeço.

valeu!

[quote=bobjba]Olá Pessoal! estudando bateu uma dúvida básica. Qual a diferença entre equals e compareTo? eu vi alguns exemplos mas não entendi direito, se alguém puder ajudar eu agradeço.

valeu![/quote]

O equals retorna um boolean indicando se o objeto comparada é ou não IGUAL ao objeto atual. Os parâmetros utilizados para verificar se os objetos são iguais devem ser definidos pelo programador, a partir das características específicas da classe, sobrescrevendo o método equals(). Se o programador não sobrescrever o equals() e comparar o objeto para verificar igualdade, será utilizado o equals() da classe Object, o qual apenas verifica igualdade entre as referências dos objetos na memória.

Algumas regrinhas a se lembrar quando sobrescrever o método equals():
Sejam três objetos de uma mesma classe ‘x’, ‘y’ e ‘z’:

:arrow: Para qualquer referência para x, x.equals(x) deve retornar true;
:arrow: Se x.equals(y) retorna true, então y.equals(x) deve também retornar true;
:arrow: Se x.equals(y) retorna true e y.equals(z) retorna true, então x.equals(z) tambem deve retornar true.
:arrow: O equals() não deve alterar o estado interno de um objeto. Isso garante que repetidas chamadas ao equals() para comparar dois objetos repetidas vezes irão retornar consistentemente true ou false
:arrow: Se x for nao nulo, x.equals(null) deve retornar false;

O compareTo verifica se um objeto é maior, menor ou igual a outro. Ao invés de retornar um boolean, ele retorna um int. Se este int for negativo, significa que o objeto atual é menor que o objeto comparado. Se retornar um int positivo significa que o objeto atual é maior que o objeto comparado, e se retornar zero significa que são iguais. Em geral o compareTo é utilizado quando se deseja ordenar um conjunto de objetos de uma dada classe, utilizando por exemplo, Collections.

Regrinhas para o método compareTo():
:arrow: Deve-se garantir que o sinal de x.compareTo(y) seja igual ao simétrico negativo de -y.compareTo(x). Em outras palavras

sinal(x.compareTo(y)) == -sinal(y.compareTo(x))

:arrow: Se x.compareTo(y) é positivo E y.compareTo(z) é positivo, então x.compareTo(z) deve tambem ser positivo.
:arrow: Se x.compareTo(y) == 0, então deve-se garantir que sinal(x.compareTo(z)) == sinal(y.compareTo(z)), para qualquer valor de z.

1 curtida

o equals vc compara valores… para saber se o valor do objeto X é equivalente ao valor do objeto Y. e o compareTo serve para ordenar um conjunto. Vamos dizer que vc tem uma lista de nomes e quer ordenar essa lista pela idade das pessoas… vc pode usasr o compareTo.

Não entendí seu exemplo… Testei semelhante só q deu NullPointerException… Vide:

[code]/**
* Usando o equals() - Cospe NullPointerException
* /
static Teste teste1;
static Teste teste2;
public static void main(String[] args) {
/

Teste teste1 = null;
Teste teste2 = null;*/

	if (teste1.equals(teste2))
		System.out.println("Igual");
	else
		System.out.println("Diferente");
}[/code]

Convém inicializar primeiro as variáveis. Se teste1 e teste2 estão a null, é óbvio que vai dar NPE…

Andre, você também precisa implementar (sobreescrever) equals da classe Teste para dar certo.

O equals() compara os valores de “instancia”, apesar de dois Objetos serem da mesma classe, por default cada instancia da classe tera um valor lógico diferente a menos que voce sobreescreva o método equals().

Lembrando: sempre sobrescrever hashcode() quando sobrescrever equals().

Cuidado que nem sempre quando a.equals(b), a.compareTo(b) == 0.

O primeiro testa se dois são iguais do ponto de vista de identidade. O segundo, em relação à ordenação natural. Embora na maioria das vezes aquela condição se verifique, ela não é garantida.

Por exemplo, dois objetos poderiam ser ordenados por nome, mas seu equals ser baseado no seu id. Nesse caso duas pessoas de mesmo nome teriam a.compareTo(b) == 0, mas como tem ids diferentes, não seriam equals.

Certo, no caso de uma requisição get com parâmetro, o ideal é usar o compareTo ou o Equals? :roll: