Integer
Klasa ma statyczną pamięć, która przechowuje 256 specjalne Integer
obiekty - 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 Integer
przedmiot.
Integer.parseInt("123");
Zwraca to int
pierwotną 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ż Integer
wartość 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 Integer
obiekt, 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 Integer
dla każdej strony równości. Ponieważ istnieją dwa różne Integer
obiekty, a ==
dla obiektów zwraca się tylko true
wtedy, 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ą int
wartość 128 po lewej stronie, z nowo utworzonym Integer
obiektem po prawej stronie. Ponieważ jednak nie ma sensu porównywać int
an Integer
, Java automatycznie rozpakuje plik Integer
przed wykonaniem porównania; więc kończysz na porównaniu int
do int
. Ponieważ prymityw 128 jest równy sobie, zwraca to true
.
.equals()
, w przeciwnym razie wszystkie zakłady są wyłączone.