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
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.
Java Dize dizisi için ArrayList içeren...
Hızlı dize PHP bir tamsayı dönüştürmek...
Dize bayt dizisi dönüştürmek için en i...
CamelCase (hiçbir sözcük ayırıcı) tümü...
Yolu Scala bir Dize için bir İnputStre...