String.concat

snowman2

snowman2

Fortgeschrittenes Mitglied
19
Ich habe die Android- und Java-Hilfe so verstanden, dass concat zwei strings verbindet, tust es bei mir aber nicht.
Code:
                String newstring = "a";
                newstring.concat("b");
Danach sollte doch eigentlich newstring = "ab" sein, oder? newstring ist aber "a".
 
Das Ergebnis von concat ist der konkatenierte String.

Achja, da du dich offenbar mit Strings in Java nicht so gut auskennst:

Man baut Java Strings nicht durch vielfaches (also mehr als 2-3 faches) Konkatenieren zusammen, weil dabei bei jedem Zwischenschritt ein neuer String entsteht. Besser ist es dann, einen StringBuilder zu nehmen. Das macht der Compiler übrigens automatisch, wenn du + benutzt.

Code:
StringBuilder tmp = new StringBuilder("a");
tmp.append("b");
String res = tmp.toString();
// String res = "a" + "b"
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: snowman2
Ich habe es im Moment mit
Code:
newstring += "b"
gelöst.

Der String setzt sich bei mir aus 2-3 kurzen Teilstrings zusammen. Ich könnte mir vorstellen, dass es aus Performance-Gründen besser währe schon vorher mitzuteilen wie lang der String maximal sein wird. Mir ist klar dass man mit Speicherplatz nicht verschwenderisch umgehen sollte aber auf 5 Bytes sollte es nicht ankommen. Kann ich newstring schon so definieren, dass direkt 10 Bytes reserviert werden?
 
Kurze Antwort: nein :)

Das Verwenden von "+=" ist wie DieGoldeneMitte sagt schon vollkommen in Ordnung, da der Compiler hier selbständig einen StringBuffer verwendet - zumindest so lange, wie die Concetationen bedingungslos hintereinander kommen.
Sobald du allerdings eine Schleife o.ä. verwendest, also z.B.
Code:
for(int i = 0; i < 10; i++)
  a += i;
kann der Compiler dies nichtmehr "umwandeln". Hier sollte man dann einen StringBuilder verwenden.
Das Problem bei den "+=" ist nicht (nur) der Speicherplatz (dieser wird ja später wieder freigegeben), sondern das erstellen von neuen Objekten ist "teuer": in der Schleife oben würde 10 mal ein neues String-Objekt erzeugt werden und dem der neue Wert zugewiesen. Merkbare Performanzunterschiede gibt es in "klein" wohl nicht wirklich, allerdings wenn du große Datenmengen verarbeitest (z.B. Daten aus nem RSS-Feed oder sowas) - dann merkt man den unterschied schon deutlich.
 
  • Danke
Reaktionen: snowman2
Ich habe zwar keine Schleife aber es wird 3 mal hintereinander je nach if-Bedingung += ausgeführt. Der Gesamtstring ist nicht größer als 12 Zeichen.
 
snowman2 schrieb:
Kann ich newstring schon so definieren, dass direkt 10 Bytes reserviert werden?

Nein. Strings sind in Java unveränderlich. Veränderliche String heißen "StringBuilder" (oder falls man es threadsafe braucht: StringBuffer). Und bei diesen kann man (mit new StringBuilder(n)) für n Zeichen Platz reservieren.

Und um es gleich vorweg zu nehmen: bei newString += "b" wird der String newString nicht verändert, sondern der Variable newString wird ein komplett neuer String zugeweisen - und zwar der, der duch Konkatenation von newString mit "b" entsteht.
 
DieGoldeneMitte schrieb:
Und um es gleich vorweg zu nehmen: bei newString += "b" wird der String newString nicht verändert, sondern der Variable newString wird ein komplett neuer String zugeweisen - und zwar der, der duch Konkatenation von newString mit "b" entsteht.

Ja das meinte ich, also wird der String ständig komplett umkopiert was Performance kostet (besonders in Schleifen und bei großen Strings). Also ist das beste das von dir vorgeschlagene "new StringBuilder(n)". So werde ich es heute Abend machen.

Danke euch allen.
 
naja bei den paar zeichen wirst keinen unterschied merken :D

man muss es mit der optimierung nicht übertreiben - aber gut wenn mans weiß.

irgendwo in den android guidelines von google steht:
"man soll erst optimieren, wenn es nötig ist" - oder so in der art :D
 
  • Danke
Reaktionen: snowman2
swordi schrieb:
irgendwo in den android guidelines von google steht:
"man soll erst optimieren, wenn es nötig ist" - oder so in der art :D

Mein Favorit:

The First Rule of Program Optimization: Don't do it.
The Second Rule of Program Optimization (for experts only!): Don't do it yet.
 
  • Danke
Reaktionen: the_alien
Jetzt wollte ich gerade anfangen zu optimieren und jetzt sehe ich ich soll es garnicht machen :crying: :biggrin:
 
snowman2 schrieb:
Ich habe es im Moment mit
Code:
newstring += "b"
gelöst.

Der String setzt sich bei mir aus 2-3 kurzen Teilstrings zusammen. Ich könnte mir vorstellen, dass es aus Performance-Gründen besser währe schon vorher mitzuteilen wie lang der String maximal sein wird. Mir ist klar dass man mit Speicherplatz nicht verschwenderisch umgehen sollte aber auf 5 Bytes sollte es nicht ankommen. Kann ich newstring schon so definieren, dass direkt 10 Bytes reserviert werden?

wenn du zur Laufzeit mehrere Strings zusammensetzen musst und du die Gesamtlänge vorher schon kennst, kannst den mit einem mit int parametrisierten Konstruktor vom Stringbuilder verwenden ;)
Das ist aber Rosinenpickerei. ^^
 
Zurück
Oben Unten