Numbers
Integer: == はキャッシュ範囲でだけ同じ参照になり得る
Integer の参照比較は値ではなくキャッシュされた同じオブジェクトかを見ます。
SourceIntegerIdentity.java
Java 21
package examples.numbers;
public final class IntegerIdentity {
private IntegerIdentity() {}
public static boolean hasSameReference(int left, int right) {
return Integer.valueOf(left) == Integer.valueOf(right);
}
}TestIntegerIdentityTest.java
Java 21
package examples.numbers;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.Test;
class IntegerIdentityTest {
@Test
void Integerはマイナス128から127まで同じ参照をキャッシュする() {
assertTrue(IntegerIdentity.hasSameReference(127, 127));
}
@Test
void Integerの128は参照比較では等しくない() {
assertFalse(IntegerIdentity.hasSameReference(128, 128));
}
}01Assertion
このテストで確認できること
- -128 から 127 の Integer はキャッシュにより同じ参照になる
- 128 の Integer は == では同じ参照と期待できない
ラッパー型の値比較には equals を使います。== はキャッシュ実装に見える偶然の一致をバグに変えます。
OBSERVED RESULT
127 == 127 → true
128 == 128 → false