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

  • backyardjay

    backyardjay

    8 ŞUBAT 2009
  • macpulenta

    macpulenta

    9 EYLÜL 2006
  • SketchBookPro

    SketchBookPr

    6 Mayıs 2009