SORU
10 Temmuz 2012, Salı


Nasıl String sınıfı operatör geçersiz kılar mı?

Neden operatör ile Dizeleri eklemek edebiliyoruz Java, Dize bir ders ne zaman? ** 5 kod bu operatör için herhangi bir uygulama bulamadım. Bu kavram, nesneye-yönelim ihlal ediyor?

CEVAP
10 Temmuz 2012, Salı


Hadi Java aşağıdaki basit ifadeye bak

int x=15;
String temp="x = " x;

Derleyici StringBuilder "x = " x; DAHİLİ olarak dönüştürür ve .append(int) "" dizesi tamsayı. eklemek için kullanır

5.1.11. String Conversion

Herhangi bir dize türü dönüştürme türü Dize dönüştürülebilir.

Basit tür değeri x T ilk referans değeri dönüştürülür eğer uygun bir sınıf örneği için bir argüman olarak vererek olarak ifade (§15.9) oluşturulması:

  • Eğer T boolean ise, o zaman yeni bir Boolean(x) kullanın.
  • Eğer T char ise, o zaman yeni Karakter(x) kullanın.
  • Eğer T bayt, kısa veya int ise, yeni Tamsayı(x) kullanın.
  • Eğer T uzun ise, o zaman yeni Uzun(x) kullanın.
  • Eğer T şamandıra ise, o zaman yeni Kaydır(x) kullanın.
  • Eğer T çift ise, o zaman yeni bir Çift(x) kullanın.

Bu referans değer string türü bir Dize dönüştürülür dönüşüm.

Şimdi sadece referans değerler olarak kabul edilmesi gerekir:

  • Eğer bu referans null ise, dize dönüştürülür "boş" (dört ASCII karakterler n, u, l, l).
  • Aksi takdirde, dönüşüm sağlar bir çağırma tarafından başvurulan bir nesne yöntemi olarak hiçbir bağımsız değişken; ama yapılır eğer olabilirdi yöntemini çağırarak sonucu null, daha sonra ise dize "null" yerine kullanılır.

Olabilirdi yöntemi ilkel bir sınıf Nesnesi tanımlanır (Madde 4.3.2). Geçersiz kılmak, özellikle Boole pek çok sınıf, Karakter, Tamsayı, kayan nokta, Çift, ve Dize.

String dönüşüm kapsamında detayları için §5.4 bakın.

15.18.1.

Dize Birleştirme optimizasyon : Bir uygulama dönüştürme ve birleştirme gerçekleştirmek için seçebilirsiniz ve sonra bir ara oluşturma atarak önlemek için bir adım String nesne. Tekrarlanan dize performansını artırmak için Java derleyici StringBuffer sınıfı kullanabilir veya birleştirme Ara Dize nesne sayısını azaltmak için benzer tekniği bir ifade değerlendirme tarafından oluşturulur.

İlkel türler için bir uygulama da optimize uzakta olabilir sarıcı oluşturulması doğrudan bir ilkel dönüştürme nesne bir dize yazın.

Optimize edilmiş sürümü aslında tam sarılmış bir Dize dönüştürme ilk değil.

Bu optimize edilmiş bir sürüm derleyici arka planda bir StringBuilder içine birşeylerin değiştiğini görebilirsiniz ilkel bir dönüşüm olmadan da olsa, derleyici tarafından kullanılan, iyi bir örnektir:

http://caprazzi.net/posts/java-bytecode-string-concatenation-and-stringbuilder/


Bu kod java:

public static void main(String[] args) {
    String cip = "cip";
    String ciop = "ciop";
    String plus = cip   ciop;
    String build = new StringBuilder(cip).append(ciop).toString();
}

Oluşturur bu iki birleştirme şekillerini aynı bayt kodu neden nasıl

 L0
    LINENUMBER 23 L0
    LDC "cip"
    ASTORE 1
   L1
    LINENUMBER 24 L1
    LDC "ciop"
    ASTORE 2

   // cip   ciop

   L2
    LINENUMBER 25 L2

    NEW java/lang/StringBuilder
    DUP
    ALOAD 1
    INVOKESTATIC java/lang/String.valueOf(Ljava/lang/Object;)Ljava/lang/String;
    INVOKESPECIAL java/lang/StringBuilder.<init>(Ljava/lang/String;)V
    ALOAD 2
    INVOKEVIRTUAL java/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    INVOKEVIRTUAL java/lang/StringBuilder.toString()Ljava/lang/String;

    ASTORE 3

    // new StringBuilder(cip).append(ciop).toString()

   L3
    LINENUMBER 26 L3

    NEW java/lang/StringBuilder
    DUP
    ALOAD 1
    INVOKESPECIAL java/lang/StringBuilder.<init>(Ljava/lang/String;)V
    ALOAD 2
    INVOKEVIRTUAL java/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;
    INVOKEVIRTUAL java/lang/StringBuilder.toString()Ljava/lang/String;

    ASTORE 4
   L4
    LINENUMBER 27 L4
    RETURN

Bayt kodu verilen örnekte kaynak kodu temel alınarak oluşturulur nasıl örnek üzerinde bakıp, derleyici DAHİLİ olarak aşağıdaki ifadeyi değiştirdi fark etmek mümkün olacak

cip ciop; 

içine

new StringBuilder(cip).append(ciop).toString();

Diğer bir deyişle, dize birleştirme operatörü etkili daha ayrıntılı StringBuilder deyim için bir kısaltma.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bunliu

    bunliu

    2 Mayıs 2007
  • CruzerLite

    CruzerLite

    1 EKİM 2011
  • mist64

    mist64

    30 Mayıs 2006