[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

ViniGodoy

== 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

ViniGodoy

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?

ViniGodoy

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.

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…

ViniGodoy

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.

hcmm

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

ViniGodoy
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