Acesta ar trebui să fie, în general, de preferat să folosiți un StringBuilder` pentru concatenarea șirurilor în Java. Este întotdeauna acest caz?
Ce vreau să spun este aceasta: Este costurile de creare a unui StringBuilder
obiect, de asteptare append () metodă și în cele din urmă
toString()deja mai mici atunci concatenarea existente siruri de caractere cu
+` operator pentru două șiruri, sau este doar recomandabil pentru mai mult (decât două) siruri de caractere?
Dacă există un astfel de prag, ceea ce nu-l depinde (probabil string lungime, dar în ce fel)?
Și, în sfârșit, ai comerțului lizibilitatea și concizie de " + " de concatenare pentru performanța de `StringBuilder în cazuri mai mici ca două, trei sau patru siruri de caractere?
Utilizarea explicită a `StringBuilder pentru regulat înlănțuirilor este menționat ca fiind caduce la învechit Java sfaturi de optimizare precum și la Java mituri urbane.
Dacă utilizați de concatenare Șir într-o buclă, ceva de genul asta,
String s = "";
for (int i = 0; i < 100; i++) {
s += ", " + i;
}
atunci ar trebui să utilizați un StringBuilder(nu
StringBuffer`) în loc de un "String", pentru că este mult mai rapid și consumă mai puțină memorie.
Dacă aveți o singură declarație,
String s = "1, " + "2, " + "3, " + "4, " ...;
apoi, puteți utiliza Șir, deoarece compilatorul va folosi StringBuilder
automat.
Ralph's răspunsul este fabulos. Aș folosi mai degrabă StringBuilder clasa a construi/a decora Șir, deoarece utilizarea este mult mai arata ca Constructor model.
public String decorateTheString(String orgStr){
StringBuilder builder = new StringBuilder();
builder.append(orgStr);
builder.deleteCharAt(orgStr.length()-1);
builder.insert(0,builder.hashCode());
return builder.toString();
}
Acesta poate fi utilizat ca un helper/constructor pentru a construi Șirul, nu Șirul în sine.
Ca regulă generală, folosiți întotdeauna mai ușor de citit codul și numai refactor dacă performanța este o problemă. În acest caz specific, cele mai recente JDK's, de fapt va optimiza codul în StringBuilder versiunea în orice caz.
De obicei doar într-adevăr nevoie să-l facă manual, dacă faci de concatenare șir într-o buclă sau într-un cod complex care compilatorul poate't optimiza cu ușurință.
Avea o privire la: http://www.javaspecialists.eu/archive/Issue068.html și http://www.javaspecialists.eu/archive/Issue105.html
Face același lucru, teste în mediul dumneavoastră și verificați dacă noi JDK sau implementarea Java a face un anumit tip de operațiune string mai bine cu String
sau mai bine cu StringBuilder`.
Operatorul + foloseste publice String concat(String str)` pe plan intern. Această metodă copii personajele din cele două șiruri, deci are cerințe de memorie și de execuție complexitate proporțională cu lungimea a două șiruri. StringBuilder funcționează mai eficient.
Cu toate acestea, am citit aici că concatination folosind codul + operater este schimbat la StringBuilder pe post Java 4 compilatoare. Deci, acest lucru ar putea să nu fie o problemă, la toate. (Deși mi-ar într-adevăr a verifica această declarație dacă aș depinde de ea în codul meu!)
Pentru două șiruri concat este mai rapid, în alte cazuri StringBuilder este o alegere mai bună, a se vedea explicația mea în https://stackoverflow.com/questions/8755063/concatenation-operator-vs-concat/13739225#13739225
Problema cu concatenare Șir este că ea conduce la copierea de obiect String cu toate costurile asociate. StringBuilder nu este sigură pentru fire și, prin urmare, este mai rapid decât StringBuffer, care a folosit pentru a fi alegerea preferată înainte de Java 5. Ca o regulă de degetul mare, nu ar trebui să facă de concatenare Șir într-o buclă, care va fi numit de multe ori. Cred că face câteva înlănțuirilor aici și acolo nu te va durea atâta timp cât nu vorbim despre sute și aceasta, desigur, depinde de cerințele de performanță. Dacă faci timp real lucrurile, ar trebui să fie foarte atent.
Certificare Microsoft material adresează aceeași întrebare. În .NET de lume, deasupra capului pentru StringBuilder obiect face o simplă alăturare de 2 Șir de obiecte mai eficient. Mi-ar asuma un răspuns similar pentru Java siruri de caractere.