IntegerKlasa ma statyczną pamięć, która przechowuje 256 specjalne Integerobiekty - jeden dla każdej wartości pomiędzy -128 i 127. Mając to na uwadze, należy rozważyć różnicę pomiędzy tymi trzema.
new Integer(123);
To (oczywiście) tworzy zupełnie nowy Integerprzedmiot.
Integer.parseInt("123");
Zwraca to intpierwotną wartość po parsowaniu String.
Integer.valueOf("123");
Jest to bardziej złożone niż inne. Zaczyna się od analizy String. Następnie, jeśli wartość wynosi od -128 do 127, zwraca odpowiedni obiekt ze statycznej pamięci podręcznej. Jeśli wartość znajduje się poza tym zakresem, wówczas wywołuje new Integer()i przekazuje wartość, aby uzyskać nowy obiekt.
Teraz rozważ trzy wyrażenia w pytaniu.
Integer.valueOf("127")==Integer.valueOf("127");
Zwraca wartość true, ponieważ Integerwartość tego parametru wynosi 127, która jest dwukrotnie pobierana ze statycznej pamięci podręcznej i porównywana z samym sobą. W grę wchodzi tylko jeden Integerobiekt, więc to się zwraca true.
Integer.valueOf("128")==Integer.valueOf("128");
Zwraca false, ponieważ 128 nie znajduje się w statycznej pamięci podręcznej. Tak więc powstaje nowy Integerdla każdej strony równości. Ponieważ istnieją dwa różne Integerobiekty, a ==dla obiektów zwraca się tylko truewtedy, gdy obie strony są dokładnie tym samym obiektem, tak właśnie będzie false.
Integer.parseInt("128")==Integer.valueOf("128");
Porównuje to pierwotną intwartość 128 po lewej stronie, z nowo utworzonym Integerobiektem po prawej stronie. Ponieważ jednak nie ma sensu porównywać intan Integer, Java automatycznie rozpakuje plik Integerprzed wykonaniem porównania; więc kończysz na porównaniu intdo int. Ponieważ prymityw 128 jest równy sobie, zwraca to true.
.equals(), w przeciwnym razie wszystkie zakłady są wyłączone.