Dlaczego te == ale nie `równe ()`?
Jestem trochę zdezorientowany tym, jak traktuje Java==
iequals()
Jeśli chodzi oint
, Integer
i inne rodzaje liczb. Na przykład:
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);
wyjścia (może powinieneś najpierw zgadnąć):
[true, true, true, false, false]
ŻeX == Y
nie należy się kompilować, ponieważ są to różne obiekty.Jestem trochę zaskoczonyY == 9
jesttrue
, biorąc pod uwagę, że 9 jest domyślnie anint
i biorąc pod uwagę, że 1) nawet się nie skompilował. Zauważ, że nie możesz umieścićint
do metody oczekującejShort
, ale tutaj są równe.Jest to zaskakujące z tego samego powodu co dwa, ale wydaje się gorsze.Nic dziwnego, jakx
jest autoboxowany do iInteger
.Nic dziwnego, ponieważ obiekty w różnych klasach nie powinny byćequal()
.Co??X == y
jesttrue
aleX.equals(y)
jestfalse
? Nie powinienem==
zawsze być bardziej surowe niżequals()
?Byłbym wdzięczny, gdyby ktoś pomógł mi to zrozumieć. Z jakiego powodu zachowują się w ten sposób == i równa się ()?
Edytować: Zmieniłem 9 na 9000, aby pokazać, że to zachowanie nie jest związane z żadnymi nietypowymi sposobami zachowywania się liczb całkowitych od -128 do 127.
2nd Edytować: OK, jeśli uważasz, że rozumiesz te rzeczy, powinieneś rozważyć następujące kwestie, aby upewnić się:
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);
wyjścia:
[false, true, true, false]
Powód, najlepiej jak rozumiem:
Inna instancja, tak inna.X
niepakowany, a następnie ta sama wartość, tak równa.Ta sama wartość, taka sama.y
nie można zapakować doInteger
więc nie może być równy.