1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

String.concat

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von snowman2, 19.02.2012.

  1. snowman2, 19.02.2012 #1
    snowman2

    snowman2 Threadstarter Erfahrener Benutzer

    Beiträge:
    153
    Erhaltene Danke:
    18
    Registriert seit:
    07.12.2011
    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".
     
  2. DieGoldeneMitte, 19.02.2012 #2
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    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: 19.02.2012
    snowman2 bedankt sich.
  3. snowman2, 20.02.2012 #3
    snowman2

    snowman2 Threadstarter Erfahrener Benutzer

    Beiträge:
    153
    Erhaltene Danke:
    18
    Registriert seit:
    07.12.2011
    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?
     
  4. sixi, 20.02.2012 #4
    sixi

    sixi Erfahrener Benutzer

    Beiträge:
    237
    Erhaltene Danke:
    64
    Registriert seit:
    20.01.2009
    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.
     
    snowman2 bedankt sich.
  5. snowman2, 20.02.2012 #5
    snowman2

    snowman2 Threadstarter Erfahrener Benutzer

    Beiträge:
    153
    Erhaltene Danke:
    18
    Registriert seit:
    07.12.2011
    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.
     
  6. DieGoldeneMitte, 20.02.2012 #6
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    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.
     
  7. snowman2, 20.02.2012 #7
    snowman2

    snowman2 Threadstarter Erfahrener Benutzer

    Beiträge:
    153
    Erhaltene Danke:
    18
    Registriert seit:
    07.12.2011
    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.
     
  8. swordi, 20.02.2012 #8
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    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
     
    snowman2 bedankt sich.
  9. DieGoldeneMitte, 20.02.2012 #9
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    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.
     
    the_alien bedankt sich.
  10. snowman2, 20.02.2012 #10
    snowman2

    snowman2 Threadstarter Erfahrener Benutzer

    Beiträge:
    153
    Erhaltene Danke:
    18
    Registriert seit:
    07.12.2011
    Jetzt wollte ich gerade anfangen zu optimieren und jetzt sehe ich ich soll es garnicht machen :crying: :biggrin:
     
  11. Fr4gg0r, 20.02.2012 #11
    Fr4gg0r

    Fr4gg0r App-Anbieter (Werbung)

    Beiträge:
    2,506
    Erhaltene Danke:
    447
    Registriert seit:
    21.12.2009
    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. ^^
     

Diese Seite empfehlen