SORU
1 Mart 2009, Pazar


En iyi yolu, bir dize için bir ArrayList dönüştürmek

Tamamen bir Dize olarak çıkış yapmak istiyorum ArrayList bir ben var. Aslında sırayla çıkış için her öğe, sekme ile ayrılmış toString kullanarak istiyorum. Herhangi bir hızlı yolu bunu yapmak için vardır? (Veya her öğe kaldırmak) döngü ve bir dizeye bir arada olabilir ama bu çok yavaş olacak sanırım.

CEVAP
1 Mart 2009, Pazar


Temelde, ArrayList üzerinde yineleme için bir döngü kullanarak tek seçenek vardır:

ArrayList<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");

String listString = "";

for (String s : list)
{
    listString  = s   "\t";
}

System.out.println(listString);

Aslında, bir dize birleştirme javac derleyici StringBuilder append operasyonların bir dizi olarak dize birleştirme zaten optimize olarak gayet iyi olacak. İşte yukarıdaki program for döngü: bayt kodu çözümünü bir parçası

   61:  new #13; //class java/lang/StringBuilder
   64:  dup
   65:  invokespecial   #14; //Method java/lang/StringBuilder."<init>":()V
   68:  aload_2
   69:  invokevirtual   #15; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   72:  aload   4
   74:  invokevirtual   #15; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   77:  ldc #16; //String \t
   79:  invokevirtual   #15; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   82:  invokevirtual   #17; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;

Görüldüğü gibi, derleyici* *13, öyle bir performans büyük bir endişe olmamalı kullanarak bu döngü en iyi duruma getirir.

(TAMAM, ikinci bakışta, StringBuilder Her döngü tekrarında örneği, en verimli bayt kodu olmayabilir. Ve StringBuilder açık başlatmasını kullanarak muhtemelen daha iyi performans verir.)

Aslında, sanırım o sahip herhangi bir tür çıktı (olması için disk veya ekran) en az bir sipariş bir büyüklük daha yavaş olması endişelenecek bir performans dize birbirine bağlanması.

Düzenleme:Açıklamalarda belirttiği gibi, yukarıda derleyici optimizasyon gerçekten her yineleme üzerinde StringBuilder yeni bir örneğini oluşturuyor. Daha önce. fark ettim ki)

Kullanmak için en iyi tekniği sadece for çemberin dışında StringBuilder tek bir nesne oluşturur Paul Tomblin tarafından yanıt olacaktır.

Yukarıdaki kod için tekrar yazarlar

ArrayList<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");

StringBuilder sb = new StringBuilder();
for (String s : list)
{
    sb.append(s);
    sb.append("\t");
}

System.out.println(sb.toString());

Sadece oluştur StringBuilder bir kez dışında döngü, ve sadece iki aramalar için * * 21* yöntem döngünün içinde, olarak kanıtlanan bu bayt kodu (gösterir örnekleme StringBuilder döngü):

   // Instantiation of the StringBuilder outside loop:
   33:  new #8; //class java/lang/StringBuilder
   36:  dup
   37:  invokespecial   #9; //Method java/lang/StringBuilder."<init>":()V
   40:  astore_2

   // [snip a few lines for initializing the loop]
   // Loading the StringBuilder inside the loop, then append:
   66:  aload_2
   67:  aload   4
   69:  invokevirtual   #14; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   72:  pop
   73:  aload_2
   74:  ldc #15; //String \t
   76:  invokevirtual   #14; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   79:  pop

Yani, gerçekten el optimizasyonu daha iyi performanslı olmalı, for döngünün içinde daha kısa olduğu ve her yineleme StringBuilder bir örneğini oluşturmaya gerek yoktur.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • cyriak

    cyriak

    29 Mart 2006
  • GoogleTechTalks

    GoogleTechTa

    15 AĞUSTOS 2007
  • TomKNJ

    TomKNJ

    26 ŞUBAT 2007