valueOf

Status
Nicht offen für weitere Antworten.

ARadauer

Top Contributor
Mhn ....

Code:
      int i = 5;
      String test = "Test: "+i; //vs
      String test2 = "Test2: "+String.valueOf(i);
Unterschiede? Meinungen? Kommentare.....

Ich nehm eigentlich immer ersteres.. .hab aber jetzt zweiteres in einem ziehmlich guten Buch gesehen... jetzt bin ich verwirrt...
 

Noctarius

Top Contributor
Ob es Unterschiede gibt, weiß ich nicht, aber wenn du z.b. eine Zahl definitiv als Text an eine Funktion übergeben musst, ist nur zweite Methode machbar (bzw eine sehr sehr sehr unschöne Andere gibt es noch). Ich denke also es ist zum Zeigen wie es geht.

Code:
public void foo(String bar) { System.out.println(bar); }

int i = 15;

foo(String.valueOf(i));
foo("" + i);

Ich denke keiner würde den zweiten Weg gehen, oder? ;)
 
G

Gast2

Gast
Also ich baue Strings eh nicht mit "+" zusammen.

Aber was machst du wenn du einem String ein int zuweisen willst
[HIGHLIGHT="Java"]
int i =0;
String s =i; // geht nicht
String s = String.valueOf(i); // geht
[/HIGHLIGHT]
 

Ebenius

Top Contributor
Ich nehm eigentlich immer ersteres.. .hab aber jetzt zweiteres in einem ziehmlich guten Buch gesehen... jetzt bin ich verwirrt...
Zweiteres ist langsamer, weil eine String-Instanz gebaut wird, die keiner benötigt und mehr Methoden aufgerufen werden. Sie bedarf mehr Schreibarbeit und erzeugt längeren (und unübersichtlicheren) Quelltext. Vorteile gibt's keine und inhaltliche Unterschiede auch nicht.

Beispiel 1 wird umgesetzt zu: [HIGHLIGHT="Java"]String test = new StringBuilder("Test: ").append(i).toString();[/HIGHLIGHT]

Beispiel 2 wird umgesetzt zu: [HIGHLIGHT="Java"]String test = new StringBuilder("Test: ").append(String.valueOf(i)).toString();[/HIGHLIGHT]

BTW: In Deinem 1. Beispiel würde je nach Compiler eventuell schon der String zur Compile-Zeit erzeugt werden, weil i ein Literal ist. Der JDT tut das. Zum testen sollte man also ... [HIGHLIGHT="Java"]int i = 4;
i ++;[/HIGHLIGHT] ... nutzen.

Mit was dann und warum nicht?
Kannst es natürlich auch wie oben selbst ausprogrammieren. "Warum nicht?" Kann ich Dir natürlich nicht sagen. Bei mir hängt es vom Anwendungsfall ab. Aber mal sehen, was SirWayne schreibt.

Ebenius
 
Zuletzt bearbeitet:

ARadauer

Top Contributor
Also ich baue Strings eh nicht mit "+" zusammen.
wenn man sich nicht in einer Schleife befindet und die Strings nicht sehr lange sind, kann man das ruhig machen...

Ich denke keiner würde den zweiten Weg gehen, oder?

ähmn mhnn... tja wie soll ich das jetzt ausdrücken.... ich mach das schon... ich wandle int in Strings um in dem ich "" dran hänge... ich bin aber lernfähig... gibt mir ein Argument und ich lasse es...
 

ARadauer

Top Contributor
ich weiß von mikrobenchmarks ist nichts zu halten... aber das spricht doch bände....

Code:
         long t = System.currentTimeMillis();
         
         for(int i = 0; i < 100000000; i++){
            String s = String.valueOf(5);
         }
         System.out.println((System.currentTimeMillis()-t));
         t = System.currentTimeMillis();
         
         for(int i = 0; i < 100000000; i++){
            String s = 5+"";
         }
         System.out.println((System.currentTimeMillis()-t));

ca 5000 ms fürs valueOf
gegen ca 60-70ms fürs +""

(umgekehrte reihenfolge auch getestet)
 

Ebenius

Top Contributor
ähmn mhnn... tja wie soll ich das jetzt ausdrücken.... ich mach das schon... ich wandle int in Strings um in dem ich "" dran hänge... ich bin aber lernfähig... gibt mir ein Argument und ich lasse es...
Also für ein kleines Testprogramm das ich hinterher wegwerfe mach ich das schon auch mal. Sonst aber nicht. Wenn nur den int in einen String umwandeln willst, ist String.valueOf(int) oder Integer.toString(int) angesagt. Das Resultat aus ... [HIGHLIGHT="Java"]"" + i;[/HIGHLIGHT] ... hat einen char-Buffer, der 16 Zeichen (alias 32 bytes) groß, egal wie lang die Zahl selbst ist. Integer.toString(int) berechnet die Länge des Strings, belegt also genau die Menge an Zeichen die benötigt wird und läuft darüber hinaus schneller.

Ebenius
 

The_S

Top Contributor
Kannst es natürlich auch wie oben selbst ausprogrammieren. "Warum nicht?" Kann ich Dir natürlich nicht sagen. Bei mir hängt es vom Anwendungsfall ab. Aber mal sehen, was SirWayne schreibt.

Darauf hatte ich es angelegt. Ich halte es für wenig sinnvoll, wenns der Compiler für einen sowieso übernimmt (ausgenommen natürlich situationen, wo es der Compiler nicht übernehmen kann).

Als kleine Ergänzung: Deutsches Java Blog von Jörg Herbst Blog Archive Strings - Erstens kommt es anders….

ähmn mhnn... tja wie soll ich das jetzt ausdrücken.... ich mach das schon... ich wandle int in Strings um in dem ich "" dran hänge... ich bin aber lernfähig... gibt mir ein Argument und ich lasse es...

Allein aus kosmetischen Aspekten würde ich das nicht machen (obwohl ich zugeben muss, dass ich ganz doll weit früher auch so programmiert habe :oops: ).
 

Noctarius

Top Contributor
Für den Compiler (wie Ebenius schon sagt):

+"" bedeutet immer Nichts, bleibt übrig 5. Das ist in diesem Fall eine Kostante und wird so direkt hinterlegt. Ergo findet hier keine wirkliche Berechnung von 5+"" statt :) - Eben wegrationalisiert *gg*
 

Marco13

Top Contributor
ich weiß von mikrobenchmarks ist nichts zu halten... aber das spricht doch bände....

Ja, wenn man es so umbaut, dass der Compiler NICHT die Komplette Schleife (und auch nicht den einzelnen String.valueOf-Aufruf) wegoptimieren kann, sieht's schon anders aus
Code:
class StringSpeedTest
{
    public static void main(String args[])
    {
     long t = System.currentTimeMillis();

     int sum = 0;
     for(int i = 0; i < 100000000; i++){
        String s = String.valueOf(i);
        sum += s.length();
     }
     System.out.println(sum+": "+(System.currentTimeMillis()-t));

     t = System.currentTimeMillis();
     sum = 0;
     for(int i = 0; i < 100000000; i++){
        String s = i+"";
        sum += s.length();
     }
     System.out.println(sum+": "+(System.currentTimeMillis()-t));
    }
}

788888890: 8328
788888890: 25483

Aber ich bin sicher, irgendjemand schafft es, "genau das gleiche" zu machen, und andere Ergebnisse zu erhalten ( -> Wer mißt, mißt Mist ;) )
 
G

Gast2

Gast
Mit was dann und warum nicht?


ich nehm StringBuilder, warum weil ich es am anfang übersichtlicher fand und seitdem nimmer abgewöhnt hab =)...

und String s = ""+5;

sieht auch komisch aus find ich, dann doch lieber String.valueOf(int), aber liegt ja immer im auge des betrachters.....
 
Zuletzt bearbeitet von einem Moderator:

Ebenius

Top Contributor
Ich finde noch immer ... [Highlight=Java]Integer.toString(int)[/Highlight] bei der einfachen Konvertierung am intuitivsten. Die Klasse mit Methode heißt genau so wie ich's auch ausprechen würde; Integer zu String eben.

Ebenius
 
S

Spacerat

Gast
788888890: 8328
788888890: 25483

Aber ich bin sicher, irgendjemand schafft es, "genau das gleiche" zu machen, und andere Ergebnisse zu erhalten ( -> Wer mißt, mißt Mist ;) )
Ich persönlich glaub' nicht dran...
Im Kapitel 50.2 im Java Handbuch von Guido Krüger kann man's nachlesen. Stringverkettungen mit "+" sind langsamer, "new String()" wie es durch "String.valueOf()" zustande kommt recht speicherintensiv ("new String()" kopiert den gesammten internen Puffer des String-Objekts).
@Edit: Kann es sein, dass, wenn recht lange Zeichenketten kopiert werden müssen, die "new String()" auch recht lange dauern kann? Nicht bei Integern... also "String.valueOf()"
 
Zuletzt bearbeitet von einem Moderator:

Ebenius

Top Contributor
@Edit: Kann es sein, dass, wenn recht lange Zeichenketten kopiert werden müssen, die "new String()" auch recht lange dauern kann? Nicht bei Integern... also "String.valueOf()"
Wo wird denn da kopiert? Integer.toString(int):
[HIGHLIGHT="Java"]int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
char[] buf = new char[size];
getChars(i, size, buf);
return new String(0, size, buf);[/HIGHLIGHT]
Ebenius
 
G

Gast2

Gast
Ich finde noch immer ... [Highlight=Java]Integer.toString(int)[/Highlight] bei der einfachen Konvertierung am intuitivsten. Die Klasse mit Methode heißt genau so wie ich's auch ausprechen würde; Integer zu String eben.

Ebenius

ja stimmt aber wenn du jetzt schnell mal aus dem int ein double oder sowas machen willst musst du eventuell 2 Stellen anpassen... aber vom lesen her klingt es logisch...

Wenn man von den Wrapper Klassen Integer, Long usw. die toString methode anschaut, dann benutzen die auch String.valueOf()....
 

Ebenius

Top Contributor
Und String.valueOf(int) ruft Integer.toString(int, int) auf, welches, im Falle dass radix (2. Argument) 10 ist, Integer.toString(int) aufruft. Warum dann nicht gleich so wie man es möchte? :)

// EDIT: Zwei Stellen anpassen? Hm. Also wenn ich aus dem int mal eben ein double mache, dann ist mir der Compile-Error eher lieb als unlieb. Meist will man bei Double eben nicht die Standard-Formatierung auf Englisch mit wissenschaftlicher Darstellung.

Ebenius
 
S

Spacerat

Gast
@Ebenius:
Guido Krüger hat gesagt.:
Soll ein String physikalisch kopiert werden, kann das mit Hilfe eines speziellen Konstruktors erreicht werden:

String s2 = new String(s1);

Da der interne Puffer hierbei kopiert wird, ist der Aufruf natürlich ineffizienter als die einfache Zuweisung.
Erneute überlegungen Integer betreffend stehen schon im voherigem Post. Würd' ja keinen Sinn machen hier zu kopieren. Hab' nur mal wieder mit einem Auge hingeschaut und nur "new String()" gelesen :oops:.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben