ProgramlamaBackend geliştirici

Java'da autoboxing ve unboxing mekanizmasının nasıl çalıştığını, risklerini ve performans veya mantık hatalarına neden olabileceği yerleri açıklayın.

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Autoboxing, ilkel türlerin (int, double vb.) karşılık gelen sarmalayıcı nesnelere (Integer, Double vb.) otomatik olarak dönüştürülmesidir. Unboxing ise sarmalayıcı nesnenin tekrar ilkel tipe dönüştürülmesidir.

Atama, metod argümanları ve koleksiyonlarda otomatik olarak çalışır:

List<Integer> numbers = new ArrayList<>(); numbers.add(5); // Autoboxing örneği: 5 (int) -> Integer(5) int value = numbers.get(0); // Unboxing: Integer(5) -> 5

Riskler:

  • Unboxing sırasında null ile NullPointerException oluşabilir;
  • Sürekli sarmalayıcı nesnelerin oluşturulması nedeniyle bellek ve zamanın verimsiz kullanımı;
  • == (referansla karşılaştırma) ve equals ile zorluklar.

Çelişkili soru.

Aşağıdaki kodun bir istisna fırlatıp fırlatamayacağını düşünüyor musunuz? Neden?

Integer x = null; int y = x;

Cevap: Kod, int y = x; ifadesi ile null'dan ilkel türe unboxing yapılmaya çalışıldığı için NullPointerException fırlatır; çünkü null, int'e dönüştürülemez.

Konunun inceliklerini bilmemekten kaynaklanan gerçek hata örnekleri.


Hikaye

Sarmalayıcı Integer koleksiyonunda toplamların hesaplanması. Toplam her arttığında yeni bir Integer nesnesi oluşturuluyor ve bu, int kullanmak yerine gerçek sunucuda önemli gecikmelere neden oluyordu.

Hikaye

Programcı, Integer'ı önbellek anahtarı olarak kullandı ve -128...127 aralığındaki değerlerin önbelleğe alındığını, diğerlerinin ise alındığını dikkate almadı. Bu nedenle == ani bir şekilde yanlış sonuçlar vermeye başladı ve sonuç olarak verilerin önbellekten yanlış bir şekilde silinmesine yol açtı.

Hikaye

REST API'ye nullable değerler geliyordu. Gelen Integer'ın basit bir unboxing'i, istemciden sayının yerine beklenmedik bir null gelmesi nedeniyle çökmesine neden olabiliyordu.