[RESOLVIDO] Diferença entre equals e ==

12 respostas
H

Alguém pode me explicar a diferença entre equals e == .

Estou tentando comparar datas usando Calendar.getTime().

Agradeço a ajuda.

12 Respostas

V

== testa se dois objetos são idênticos. Ou seja, se ocupam o mesmo local na memória.

Equals testa conteúdo.

Você pode ter 2 strings, por exemplo, com o mesmo conteúdo, mas sendo objetos diferentes:

String a = new String(Teste);

String b = new String(Teste);

a == b; //False
a.equals(b); //True

O mesmo vale pro seu calendar.

O == só testa conteúdo no caso dos tipos primitivos.

E

== , compara a referenção de um objeto na memória
equals compara o valor dele

Ex

Integer x = 0;
Integer y =0;

// x == y - isso retorna false, pois os OBJETOS são diferentes
//x.equals(y) - isso retorna true, pois os VALORES são iguais

E

mals ai rsrs , quando comecei a escrever ainda não tinha nenhuma resposta

V

Agora especificamente sobre o calendar.

Não há diferença entre fazer:

calendar.equals(outroCalendar);

Ou:

Calendar.getTime().equals(outroCalendar.getTime());

A função getTime() não retorna as horas, e sim, a data e hora, encapsulada num objeto do tipo DateTime. Se você quiser lidar só com as horas, precisará comparar campo a campo, usando o get.

Outra opção é largar essa horrível biblioteca de calendar da Oracle e usar o Joda-Time:
http://joda-time.sourceforge.net/

H

Valeu pela explicação, mas ainda tenho problemas.

Tenho uma classe intervalo, e estou tentando comparar dois intervalos. Intervalo tem Date inicial e Date final.

Já fiz a comparação de várias maneiras, a útlima foi essa.

public static boolean equals(Interval i1, Interval i2) {

if(i1.getStartDate().compareTo(i2.getStartDate())== 0)

if(i1.getEndDate().compareTo(i2.getEndDate())== 0){

System.out.println(datas iguais);

return true;

}

System.out.println(datas diferentes);

return false;

}

e a saída está abaixo

Sun May 01 00:00:00 BRT 2011
Wed Jun 01 00:00:00 BRT 2011
Sun May 01 00:00:00 BRT 2011
Wed Jun 01 00:00:00 BRT 2011
datas diferentes

Alguém pode me mostrar onde estou falhando?

V

O compare testará até os milissegundos das duas datas. Tem certeza que são idênticos?

O if pode ser simplificado para:

if (i1.getStartDate().equals(i2.getStartDate()) && i1.getEndDate().equals(i2.getEndDate()) System.out.println("Intervalos idênticos"); else System.out.println("Intervalos diferentes");

H

Obrigado pela ajuda.

Resolvi o problema. Estava faltando zerar os milisegundos antes da comparação.

H

Valeu ViniGodoy, tinha acabado de resolver.

haha

Abraço.

H

resgatando o tópico: Entendi que o == compara as referências mas e no caso dos outros operadores (<=, >=, !=). Funcionam do mesmo tipo? Existe algum método para testar conteúdo quando falamos deles?

Att…

V

hcmm:
resgatando o tópico: Entendi que o == compara as referências mas e no caso dos outros operadores (<=, >=, !=). Funcionam do mesmo tipo? Existe algum método para testar conteúdo quando falamos deles?

Att…

Não. Esses operadores simplesmente não funcionam com objetos.

H

Entedi… mas, por exemplo, Caso eu queira testar se um objeto do tipo Integer é maior ou igual a outro. Como faço?

V
hcmm:
ViniGodoy:

Não. Esses operadores simplesmente não funcionam com objetos.

Entedi... mas, por exemplo, Caso eu queira testar se um objeto do tipo Integer é maior ou igual a outro. Como faço?

Você tem que chamar o método intValue(), longValue(), etc... para retornar o valor e então comparar.

As classes que são wrappers de tipos primitivos (Integer, Short, Byte, Character, Long, Double, Float e Boolean) são tratadas de maneira especial pela VM. Elas fazem o que chamamos de Auto-boxing e Unboxing. Como a VM sabe que se tratam de classes que guardam tipos primitivos, isso aqui é possível:

Integer x = 10; //Equivalente a Integer x = Integer.valueOf(10);
Integer y = 20; //Equivalente a Integer x = Integer.valueOf(350);

if (x >= 5) //Equivalente a if (x.intValue() >= 5) {
    System.out.println("X é maior do que 5");
}

Entretanto, é preciso tomar cuidado, pois o AutoBoxing custa caro. Além disso, nem sempre o resultado é o esperado, veja:

Integer x= 50;
Integer y = 50;
Integer z = 500;
Integer w = 500;

if (x == y) {
    System.out.println("X é igual a Y");
}

if (z == w) {
    System.out.println("Z é igual a W");
}

if (z == 500) {
    System.out.println("Z é igual a 500");
}

if (w == 500) {
    System.out.println("W é igual a 500");
}

O resultado desse código é:
X é igual a Y
Z é igual a 500
W é igual a 500

Por que Z não é igual a W? A pegadinha do Mallandro é que: como no caso temos dois objetos, não é feito o auto-unboxing. Então, são comparadas as referências. Z e W são objetos diferentes na memória, por isso, o retorno false. Mas, se é assim, por que x == y?

Por que o auto-boxing tem um cache de números no intervalo -127 até 128, retornando sempre o mesmo objeto nesses casos.

Cruel, não?

Criado 9 de maio de 2011
Ultima resposta 10 de nov. de 2013
Respostas 12
Participantes 4