Ketika Anda mengkompilasi angka literal di Jawa dan menetapkannya ke Integer (modal I
) kompiler memancarkan:
Integer b2 =Integer.valueOf(127)
Baris kode ini juga dihasilkan ketika Anda menggunakan autoboxing.
valueOf
diimplementasikan sedemikian rupa sehingga angka-angka tertentu "dikumpulkan", dan mengembalikan contoh yang sama untuk nilai yang lebih kecil dari 128.
Dari kode sumber java 1.6, baris 621:
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
Nilai high
dapat dikonfigurasi ke nilai lain, dengan properti sistem.
-Djava.lang.Integer.IntegerCache.high = 999
Jika Anda menjalankan program Anda dengan properti sistem itu, itu akan menampilkan true!
Kesimpulan yang jelas: tidak pernah bergantung pada dua referensi yang identik, selalu membandingkannya dengan .equals()
metode.
Jadi b2.equals(b3)
akan mencetak true untuk semua nilai yang sama secara logis dari b2, b3.
Perhatikan bahwa Integer
cache tidak ada untuk alasan kinerja, tetapi lebih untuk menyesuaikan dengan JLS, bagian 5.1.7 ; identitas objek harus diberikan untuk nilai -128 hingga 127 inklusif.
Integer # valueOf (int) juga mendokumentasikan perilaku ini:
metode ini cenderung menghasilkan kinerja ruang dan waktu yang lebih baik secara signifikan dengan caching nilai yang sering diminta. Metode ini akan selalu menyimpan nilai dalam rentang -128 hingga 127, inklusif, dan mungkin menyimpan nilai lainnya di luar rentang ini.