Por que estes são == mas não `equals ()`?
Estou um pouco confuso sobre a maneira como o Java trata==
eequals()
quando se trata deint
, Integer
e outros tipos de números. Por exemplo:
Integer X = 9000;
int x = 9000;
Short Y = 9000;
short y = 9000;
List<Boolean> results = new ArrayList<Boolean>();
// results.add(X == Y); DOES NOT COMPILE 1)
results.add(Y == 9000); // 2)
results.add(X == y); // 3)
results.add(X.equals(x)); // 4)
results.add(X.equals(Y)); // 5)
results.add(X.equals(y)); // 6)
System.out.println(results);
saídas (talvez você deva fazer sua suposição primeiro):
[true, true, true, false, false]
queX == Y
não compilar é de se esperar, sendo objetos diferentes.Estou um pouco surpreso queY == 9
étrue
, dado que 9 é por padrão umint
e dado que 1) nem compilou. Note que você não pode colocar umint
em um método esperando umShort
, mas aqui eles são iguais.Isto é surpreendente pela mesma razão que dois, mas parece pior.Não é surpreendente, comox
é autoboxed para eInteger
.Não é de surpreender, pois objetos em diferentes classes não devem serequal()
.O que??X == y
étrue
masX.equals(y)
éfalse
? Não deve==
sempre ser mais rigoroso do queequals()
?Eu apreciaria se alguém pudesse me ajudar a entender isso. Por que razão == e equals () se comportam dessa maneira?
Editar: Eu mudei 9 para 9000 para mostrar que esse comportamento não está relacionado a qualquer maneira incomum que os números inteiros de -128 a 127 se comportem.
2nd Editar: OK, se você acha que entende essas coisas, considere o seguinte, só para ter certeza:
Integer X = 9000;
Integer Z = 9000;
short y = 9000;
List<Boolean> results = new ArrayList<Boolean>();
results.add(X == Z); // 1)
results.add(X == y); // 2)
results.add(X.equals(Z)); // 3)
results.add(X.equals(y)); // 4)
System.out.println(results);
saídas:
[false, true, true, false]
A razão, tanto quanto eu entendo:
Instância diferente, tão diferente.X
unboxed, então mesmo valor, tão igual.Mesmo valor, tão igual.y
não pode ser encaixotado a umInteger
então não pode ser igual.