SORU
23 Kasım 2010, Salı


Bitiştirmek Java dizeleri null

Neden şu işe yarıyor mu? NullPointerException atılan olmanızı beklerdim.

String s = null;
s = s   "hello";
System.out.println(s); // prints "nullhello"

CEVAP
23 Kasım 2010, Salı


Nedengerekirbu iş?

JLS 8, § 5.1.11 "String Conversion"JLS 5, Section 15.18.1.1 JLS 8 § 15.18.1 "String Concatenation Operator " lider bu işlem hata başarılı gerektirir:

...Şimdi sadece referans değerler olarak kabul edilmesi gerekir.Eğer bu referans null ise, dize dönüştürülür "" . null (dört ASCII karakterler n, u, l, l). Aksi takdirde, dönüşüm yapıldı sanki bir çağrı olabilirdi yöntemi başvurulan bir nesne ile herhangi bir argüman; ama eğer sonuç çağırma yöntemi olabilirdi null, sonra Dize "null" yerine kullanılır.

Nasılişe yarıyor mu?

Bu bayt kodu bakalım! Derleyici kodunuzu alır:

String s = null;
s = s   "hello";
System.out.println(s); // prints "nullhello"

ve bayt koduna derler eğer bu yazılı olsaydı yerine:

String s = null;
s = new StringBuilder(String.valueOf(s)).append("hello").toString();
System.out.println(s); // prints "nullhello"

(javap -c kullanarak kendiniz de yapabilirsiniz)

Ekleme StringBuilder yöntemleri tüm boş sadece ince kolu. null ilk tartışma String.valueOf() çünkü bu durumda StringBuilder olmadığı için yerine çağrılan rasgele herhangi bir başvuru türü götüren bir kurucu.

Bunun yerine s = "hello" s yapmış olsaydın, eşdeğer kodu şöyle olacaktır:

s = new StringBuilder("hello").append(s).toString();

bu durumda ekleme yöntemi null alırsonratemsilciler 14* *için.

Not:Dize birleştirme aslında derleyici gerçekleştirmek için karar alır ender yerlerden biridir. Gibi," kod derleyici. derleyici farklı olabilir "tam eşdeğer Bu optimizasyon JLS, Section 15.18.1.2 ile izin verilir:

Tekrarlanan dize birleştirme performansını artırmak için bir Java derleyicisi StringBuffer sınıfı veya bir ifadenin değerlendirilmesi ile oluşturulan Ara Dize nesne sayısını azaltmak için benzer bir tekniği kullanabilir.

Belirlemek için kullanılan derleyici "eşdeğer kodu" üzerinde Eclipse derleyiciAvrupa Adalet Divanı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • chickenby

    chickenby

    2 HAZİRAN 2008
  • Damien Walters

    Damien Walte

    20 AĞUSTOS 2006
  • Jason Parker

    Jason Parker

    14 Aralık 2009