Joshua Bloch'un Etkili Java'sında , Madde 5: "Gereksiz nesneler oluşturmaktan kaçının", aşağıdaki kod örneğini yayınlar:
public static void main(String[] args) {
Long sum = 0L; // uses Long, not long
for (long i = 0; i <= Integer.MAX_VALUE; i++) {
sum += i;
}
System.out.println(sum);
}
ve koşması 43 saniye sürer. Long'u ilkele sokmak onu 6.8 saniyeye indirir ... Bu ilkel neden kullandığımızın bir göstergesi ise.
Yerel değer eşitliğinin olmaması da bir endişe kaynağıdır ( .equals()
ile karşılaştırıldığında oldukça ayrıntılıdır ==
)
biziclop için:
class Biziclop {
public static void main(String[] args) {
System.out.println(new Integer(5) == new Integer(5));
System.out.println(new Integer(500) == new Integer(500));
System.out.println(Integer.valueOf(5) == Integer.valueOf(5));
System.out.println(Integer.valueOf(500) == Integer.valueOf(500));
}
}
Sonuçlar:
false
false
true
false
EDIT (3) neden geri dönüyor true
ve (4) geri dönüyor false
?
Çünkü onlar iki farklı nesne. Sıfıra en yakın 256 tam sayı [-128; 127] JVM tarafından önbelleğe alınır, böylece bunlar için aynı nesneyi döndürürler. Bu aralığın ötesinde, önbelleğe alınmazlar, böylece yeni bir nesne oluşturulur. İşleri daha karmaşık hale getirmek için JLS, en az 256 sinek ağırlığının önbelleğe alınmasını talep ediyor . JVM uygulayıcıları istedikleri zaman daha fazlasını ekleyebilirler, yani bu en yakın 1024'ün önbelleğe alındığı ve hepsinin doğru döndüğü bir sistemde çalışabilir ... #awkward