SORU
6 EYLÜL 2008, CUMARTESİ


Dize birleştirme: () herhangi bir parametre vs operatörü

Merak ediyorum ve emin değildi, kimlik sormak diye düşündüm:

bir Dize varsayarak ve b.

a =b
a.concat(b)

Kaputun altında aynı şey mi?

Düzenleme:

Henüz bunu yapmak için nasıl burada herhangi bir parametre referans olarak, operatör derleme yapabilmek için o ne yaptığını görmek istiyorum, emin decompiled değil.

public String concat(String s) {

    int i = s.length();
    if (i == 0) {
        return this;
    } else {
        char ac[] = new char[count   i];
        getChars(0, count, ac, 0);
        s.getChars(0, i, ac, count);
        return new String(0, count   i, ac);
    }
}

CEVAP
6 EYLÜL 2008, CUMARTESİ


Hayır, tam olarak değil.

Öncelikle, anlambilim aralarında küçük bir fark vardır. Eğer a null a.concat(b) NPEs ama a =b null sanki a orijinal değerini görür. Ayrıca, concat() yöntem operatör sessizce bir Dize (nesneler için toString() yöntemi kullanarak değişken dönüştürme sırasında String değerleri kabul eder. Bu kadar concat() yöntemi kabul ne daha sıkı.

Kaputun altına bakmak için, a = b ile basit bir sınıf yazmak;

public class Concat {
    String cat(String a, String b) {
        a  = b;
        return a;
    }
}

Şimdi javap -c ile (Güneş FIRSATLAR dahil) sökülmesi. Listesi de dahil olmak üzere görmelisiniz:

java.lang.String cat(java.lang.String, java.lang.String);
  Code:
   0:   new     #2; //class java/lang/StringBuilder
   3:   dup
   4:   invokespecial   #3; //Method java/lang/StringBuilder."<init>":()V
   7:   aload_1
   8:   invokevirtual   #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   11:  aload_2
   12:  invokevirtual   #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   15:  invokevirtual   #5; //Method java/lang/StringBuilder.toString:()Ljava/lang/    String;
   18:  astore_1
   19:  aload_1
   20:  areturn

Yani, a = b denktir

a = new StringBuilder()
    .append(a)
    .append(b)
    .toString();

concat yöntemi daha hızlı olması gerekir. Ancak, daha fazla dizeleri ile StringBuilder yöntem, en azından performans açısından kazanır.

String StringBuilder (paket-özel temel sınıf) kaynak kodunu Güneş yazılım ve programları src.zip mevcuttur. Char bir dizi (gerektiği gibi yeniden boyutlandırma) kadar bina ve sonra String final oluşturduğunuzda, bunu bir kenara atmak olduğunu görebilirsiniz. Uygulamada bellek ayırma şaşırtıcı derecede hızlı.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • parlophone

    parlophone

    28 ŞUBAT 2006
  • RD

    RD

    19 NİSAN 2006
  • wwjoshdu

    wwjoshdu

    18 ŞUBAT 2011