1. Hast Du Lust, bei uns mitzuarbeiten und das AH-Team zu verstärken? Alle Details zu dieser aktuellen Herausforderung findest Du hier.
  1. snowman2, 19.02.2012 #1
    snowman2

    snowman2 Threadstarter Erfahrener Benutzer

    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

    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 gefällt das.
  3. snowman2, 20.02.2012 #3
    snowman2

    snowman2 Threadstarter Erfahrener Benutzer

    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

    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 gefällt das.
  5. snowman2, 20.02.2012 #5
    snowman2

    snowman2 Threadstarter Erfahrener Benutzer

    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

    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

    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

    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 gefällt das.
  9. DieGoldeneMitte, 20.02.2012 #9
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    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 gefällt das.
  10. snowman2, 20.02.2012 #10
    snowman2

    snowman2 Threadstarter Erfahrener Benutzer

    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)

    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. ^^
     
Du betrachtest das Thema "String.concat" im Forum "Android App Entwicklung",