Performance String-Operationen und StringBuffer (1.4und 1.5)

Status
Nicht offen für weitere Antworten.

thomator

Bekanntes Mitglied
Moin,
ich hab neulich was gelesen über Performance bei String-Operationen im Zusammenhang mit Java 1.4 und Java 5.
Demnach nutzen die StringBuffer in 5 nicht mehr den shared-char[] für die Methode toString(), was zu Performanceeinbußen for allem bei großen Strings im StringBuffer führt. Das leuchtet auch ein, da ja jedesmal der char-Array komplett kopiert werden muss.
Also ich einen mini-Test geschrieben mit 100.000 String-Operationen ((String += "trallalla") und StringBuffer.append()).
Das Ganze dann mit Version 1.4 und Version 5 ausgeführt und voll den Schock bekommen:
Die String-Operationen sind unter Java 5 ALLE um den Faktor 10 langsamer, als in Java 1.4!!! Auch das +=.
Hat da jemand ne Erklärung für?
Auch der StringBuffer mit append, also ohne toString() ist deutlich langsamer, als der gleiche Code unter 1.4.
Schon mal wer mit dem Problem zu tun gehabt?



PS: der Server geht ne Stunde vor^^
 

thomator

Bekanntes Mitglied
Moin,
also Problem wäre für mich zum Beispiel, dass sämtliche XML-APIs massiv an Performance einbüßen müssten, wenn sich die StringOperationen alle so verlangsamt haben.
Mit verschiedenen VMs hab ich das noch nicht getestet. Mit dem StringBuilder das werd ich mal testen.
Das war mein Test-Quellcode:
Code:
public static void main(String[] args){
	Date date1 = new Date();
	Date date2 = null;
	String s = new String();
	for (int i = 0; i < 10000; i++) {
		s += "sers";
	}
	date2 = new Date();
	System.out.println("10.000 'sers' add to String: " + (date2.getTime() - date1.getTime()));

	date1 = new Date();
	StringBuffer sb = new StringBuffer();
	for (int i = 0; i < 10000; i++) {
		sb.append("sers");
		s = sb.toString();
	}

	date2 = new Date();
	System.out.println("10.000 'sers' add to StringBuffer: " + +(date2.getTime() - date1.getTime()));
	}
Wie gesagt, die Ausführungsgeschwindigkeit, selbst wenn man das sb.toString() auskommentiert, ist heftigst verschieden (1.4 und 5)...
 

thomator

Bekanntes Mitglied
So, jetzt habe ich den StringBuilder auch noch mal probiert:
Code:
StringBuilder sBuilder = new StringBuilder();
	date1 = new Date();
	for (int i = 0; i < 30000; i++) {
		sBuilder.append("sers");
		//s = sBuilder.toString();
	}
	date2 = new Date();
	System.out.println("10.000 'sers' add to StringBuilder: " + +(date2.getTime() - date1.getTime()));
Also ich hab alle Varianten mal mit 30.000 Schleifendurchläufen versehen und siehe da: der StringBuilder ist langsamer, als der StringBuffer. Was sagt man dazu...
 
S

SlaterB

Gast
was hast du denn für einen lahmen Rechner, dass du bei 10k oder 30k irgendwas bemerkst,
+-30ms musst du immer rechnen, da fällt die 1ms Berechnungszeit nicht wirklich ins Gewicht ;)

hier mal etwas aussagekräftigeres:

Code:
public class Test
{
    static int k = 300000;

    public static void main(String[] args)
    {
        // normal();
        buffer();
        builder();
        buffer();
        builder();
    }

    public static void normal()
    {
        Date date1 = new Date();
        String s = new String();
        for (int i = 0; i < k; i++)
        {
            s += "sers";
        }
        Date date2 = new Date();
        System.out.println("String       : " + (date2.getTime() - date1.getTime()));
    }

    public static void buffer()
    {
        Date date1 = new Date();
        for (int j = 0; j < 100; j++)
        {
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < k; i++)
            {
                sb.append("sers");
                // s = sb.toString();
            }
        }
        Date date2 = new Date();
        System.out.println("StringBuffer : " + +(date2.getTime() - date1.getTime()));
    }

    public static void builder()
    {
        Date date1 = new Date();
        for (int j = 0; j < 100; j++)
        {
            StringBuilder sBuilder = new StringBuilder();
            for (int i = 0; i < k; i++)
            {
                sBuilder.append("sers");
                // s = sBuilder.toString();
            }
        }
        Date date2 = new Date();
        System.out.println("StringBuilder: " + +(date2.getTime() - date1.getTime()));
    }
}

-----

30 Mio. appends, Ausgabe:


StringBuffer : 6216
StringBuilder: 6137
StringBuffer : 6310
StringBuilder: 6200

ob nun synchronisiert oder nicht ist praktisch egal,
zu Java 1.4 kann ich nix sagen,
wenn du nur mit 10k append getestet hast, dann jedenfalls stark zu bezweifeln
 

thomator

Bekanntes Mitglied
Ok, ich nehm alles zurück und behaupte das Gegenteil. Ich hab als erstes immer den Test mit den einfachen Strings am laufen gehabt, das war wohl ein Fehler. Durch die String-Verknüpfungen sind wahrscheinlich so viele Objekte auf dem Speicher erstellt worden, dass nachher die Garbage-Collection die nachfolgenden Tests 'leicht' beeinflußt hat.
@Slater
So lahm is mein Rechner gar nich, ich komm ohne die String-Verknüpfungen fast auf die gleichen Zeiten, wie Du. :cool:

Ok, also Thread schließen und vergessen, der Fehler lag wie meist zwischen den Ohren.
 

Murray

Top Contributor
Bei solchen Benchmarks ist immer etwas Vorsicht angebracht, schon weil der Rechner ja evtl. noch etwas anderes zu tun bekommt. Und je nach Größe und Anzahl der in den Operationen allokierten Objekte misst man evtl. auch irgendwann nur noch die GarbageCollection.
Auf jeden Fall ist es sinnvoll, für so einen Vergleich noch eine äußere Schleifen laufen zu lassen und so irgendwelche zufälligen Einflüsse besser auszumitteln.

Beim StringBuilder und beim StringBuffer zahlt es sich oft aus, ihn gleich so groß anzulegen wie man ihn am Ende braucht; dadurch spart man sich das dynamische Vergrößern.

Code:
public class StrPerf {
	
	
	public static void main(String[] args) {
		
		
		long t0 = 0;
		long s1 = 0;
		long s2 = 0;
		long s3 = 0;
		long s4 = 0;
		long s5 = 0;
		long s6 = 0;
		
		long l = 0;
		String s; 
		final int loop = 20;
		final int cnt = 10000;
		final int siz = 4*cnt;
		
		for ( int i=0; i<loop; i++) {
			t0 = System.currentTimeMillis();
			
			s = new String();
			for (int j = 0; j < cnt; j++) {
				s += "sers";
			}
			s1 += (System.currentTimeMillis()-t0);
			l += s.length();

			s = new String();
			for (int j = 0; j < cnt; j++) {
				s = s.concat( "sers");
			}
			s2 += (System.currentTimeMillis()-t0);
			l += s.length();

			t0 = System.currentTimeMillis();
			StringBuffer sbf = new StringBuffer();
			for (int j = 0; j < cnt; j++) {
				sbf.append("sers");
			}
			s = sbf.toString();
			s3 += (System.currentTimeMillis()-t0);
			l += s.length();

			t0 = System.currentTimeMillis();
			StringBuilder sbl = new StringBuilder();
			for (int j = 0; j < cnt; j++) {
				sbl.append("sers");
			}
			s = sbl.toString();
			s4 += (System.currentTimeMillis()-t0);
			l += s.length();

			t0 = System.currentTimeMillis();
			StringBuffer sbfi = new StringBuffer( siz);
			for (int j = 0; j < cnt; j++) {
				sbfi.append("sers");
			}
			s = sbfi.toString();
			s5 += (System.currentTimeMillis()-t0);
			l += s.length();

			t0 = System.currentTimeMillis();
			StringBuilder sbli = new StringBuilder( siz);
			for (int j = 0; j < cnt; j++) {
				sbli.append("sers");
			}
			s = sbl.toString();
			s6 += (System.currentTimeMillis()-t0);
			l += s.length();

		}
		
		System.out.println( "+=:                    " + s1);
		System.out.println( "concat:                " + s2);
		System.out.println( "StringBuffer(default): " + s3);
		System.out.println( "StringBuilder(default):" + s4);
		System.out.println( "StringBuffer(alloc'd): " + s5);
		System.out.println( "StringBuilder(alloc'd):" + s6);
		
	}
}

Auf meinem (betagten) Rechner ergibt das (zweimal mit Hotspot-VM, zweimal mit Server-VM):

Code:
C:\home\work>\programme\java\jdk1.6.0\bin\java StrPerf
+=:                    44470
concat:                56328
StringBuffer(default): 47
StringBuilder(default):16
StringBuffer(alloc'd): 30
StringBuilder(alloc'd):48

C:\home\work>\programme\java\jdk1.6.0\bin\java StrPerf
+=:                    35532
concat:                44719
StringBuffer(default): 16
StringBuilder(default):31
StringBuffer(alloc'd): 15
StringBuilder(alloc'd):32


C:\home\work>\programme\java\jdk1.6.0\bin\java -server StrPerf
+=:                    29245
concat:                37795
StringBuffer(default): 32
StringBuilder(default):32
StringBuffer(alloc'd): 15
StringBuilder(alloc'd):48

C:\home\work>\programme\java\jdk1.6.0\bin\java -server StrPerf
+=:                    29205
concat:                37451
StringBuffer(default): 48
StringBuilder(default):32
StringBuffer(alloc'd): 16
StringBuilder(alloc'd):0

Ich würde daraus nur folgende Schlüsse ziehen
a) concat ist etwas langsamer als +=
b) concat und += sind erheblich langsamer als StringBuffer/StringBuilder
c) ob StringBuffer oder StringBuilder, macht kaum einen messbaren Unterschied
d) die Vorallokation des Buffers bringt augenscheinlich nicht sehr viel
e) für die mit der Erzeugung vieler temporärer Objekte verbundenen Asätz mit += und concat hat die Server-VM die Nase vorn
 
S

SlaterB

Gast
also deine Aussagen c und d sind ja erstaunlich,
du sagst es selber und ich habe es doch hier im Thread auch schon erwähnt:
+-30ms sind reiner Zufall, was macht es für einen Sinn 48ms zu messen?

lasse += und concat weg und verlängere die Messung um den Faktor 100-1000, dann wirds langsam sichtbar
 

Murray

Top Contributor
SlaterB hat gesagt.:
also deine Aussagen c und d sind ja erstaunlich,
du sagst es selber und ich habe es doch hier im Thread auch schon erwähnt:
+-30ms sind reiner Zufall, was macht es für einen Sinn 48ms zu messen?

lasse += und concat weg und verlängere die Messung um den Faktor 100-1000, dann wirds langsam sichtbar
Da habe ich mich wohl falsch ausgedrückt - ich meinte, dass genau diese Ergebnisse keine weiteren Schlüsse zulassen. Wenn man genauer feststellen willen, was z.B. die Vorallokation bringt, dann muss man genauer messen.
 
S

SlaterB

Gast
naja, was macht es für einen Sinn, so ein ungenaues Programm zu schreiben und dann 'macht kaum einen messbaren Unterschied' zu schreiben,

das klingt eher, als wenn das einfache System.currentTimeMillis(); nicht hilft/ man ganz andere Testmethodenbraucht,
als dass man einfach zwei Nullen einfügen muss,
eine minimale Programmänderung um sehr viel genauere Ergebnisse zu erhalten ;)
 
G

Guest

Gast
hi,

greife das thema nochmal auf, wenn ich das programm von slaterb so abänder, das 1000 string pro methode erzeugt werden, dann bekomme ich relative aussagekräftige werte:

Code:
import java.util.*; 

public class Test
{
    static int k = 3000;

    public static void main(String[] args)
    {
    	System.out.print("1  ");
        normal();
        
        System.out.print("2  ");
        buffer();
        
        System.out.print("3  ");
        builder();
        
        System.out.print("4  ");
        buffer();
        
        System.out.print("5  ");
        builder();
    }

    public static void normal()
    {
        Date date1 = new Date();
        for (int j = 0; j < 1000; j++)
        {
            String s = new String();
            for (int i = 0; i < k; i++)
            {
                s += "sers";
            }
        }
        Date date2 = new Date();
        System.out.println("String       : " + (date2.getTime() - date1.getTime()));
    }


    public static void buffer()
    {
        Date date1 = new Date();
        for (int j = 0; j < 1000; j++)
        {
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < k; i++)
            {
                sb.append("sers");
                String s = sb.toString();
            }
        }
        Date date2 = new Date();
        System.out.println("StringBuffer : " +(date2.getTime() - date1.getTime()));
    }

    
    public static void builder()
    {
        Date date1 = new Date();
        for (int j = 0; j < 100; j++)
        {
            StringBuilder sBuilder = new StringBuilder();
            for (int i = 0; i < k; i++)
            {
                sBuilder.append("sers");
                String s = sBuilder.toString();
            }
        }
        Date date2 = new Date();
        System.out.println("StringBuilder: " +(date2.getTime() - date1.getTime()));
    }
}


Ergebnis:
=======
Code:
1  String       : 87411
2  StringBuffer : 45307
3  StringBuilder: 4454
4  StringBuffer : 45448
5  StringBuilder: 4469
 
S

SlaterB

Gast
Spassvogel,

ändere mal
> buffer() for (int j = 0; j < 1000; j++)
> builder() for (int j = 0; j < 100; j++)
wieder zu einem fairen Zweikampf,
dann hast du wieder annähernd die gleiche Zeit..
 
M

morgenlan.de

Gast
Ich bin auf diesen Thread gestossen, weil ich gerne mal nach Links auf meine Seiten suche. Also hier den Link auf meinen Artikel über den Speicherverbrauch in Zusammenhang mit StringBuffer und String.
Ich habe mich mit dem Thema aufgrund von Speicherproblemen beschäftigt und nicht aufgrund von Performance.

Aber vielleicht mal zum allgemeinen Verständnis:

Intern wird die Operation "+" auf Strings durch StringBuffer "append" realisiert, ausser bei bereits zur Compile Time realisierbaren Konkatenierungen, diese werden bereits vom Compiler zusammengefasst.

Also
Code:
String test="test";
test=test+" test";
ist mehr oder weniger identisch mit
Code:
String test="test";
test=(new StringBuffer(test)).append(" test").toString;

Daher gibt es hier weder in der Performance noch im Speicherverbrauch Unterschiede, jedenfalls bei einer einzelnen Ausführung.

Anders sieht es in Schleifen aus. Da in einer Schleife bei jeder Konkatenierung mit "+" wieder intern ein neuer StringBuffer angelegt wird, was aufwendiger ist als bei einem einzelnen StringBuffer immer wieder neu anzuhängen.
Ein weiterer Effekt dabei ist, dass beim Anhängen an einen StringBuffer der interne Speicher verdoppelt wird, d.h. nicht jede "append" Operation führt zu einer internen Vergrösserung des Arrays mit anschliessendem Umkopieren, sondern nur dann, wenn die Speichergrösse überschritten wird. Da die Vergösserung durch Verdoppellung geschieht wächst der verfügbare Speicher sehr schnell, wenn man also sehr oft kurze Strings anfügt, wird nur sehr selten der Speicher vergrössert und umkopiert. Bei der "+" Methode wird jedesmal ein StringBuffer generiert, dann intern der Speicher vergrössert und dann das Array intern umkopiert.
Hier ist also StringBuffer dem normalen String in der Performance überlegen.´

Mein Problem war dabei aber nie die Performance, sondern die schlechte Speicherplatznutzung.
Wenn man einen String hat der bereits sehr lang ist, und dann einen kurzen String anhängt, dann verdoppelt sich im schlimmsten Fall der verbrauchte Speicher.
Angenommen wir haben folgenden Fall:
Code:
char arr[]=new char[16000];
... was reinschreiben
String test=new String(arr);
test=test+"abc";

Dann wird intern das Array auf 32000 Zeichen vergrössert, obwohl nur 3 Zeichen angehängt werden.

Eine Besonderheit ist dabei, dass die StringBuffer.toString() Methode bis JDK 1.4 nicht das interne char[] kopiert, sondern den String das interne Array zuweist, so dass im Beispiel oben der String test auch weiterhin 32000 Zeichen intern enthält, obwohl nur 16003 Zeichen benötigt werden.

Ab JDK 1.5 wird bei toString() eine Kopie des internen char[] angelegt, das genau so gross ist wie der tatsächlich benötigte Speicherplatz.

Im Prinzip funktioniert die toString() Routine ab JDK 1.5 wie die .substring(0) Routine bis JDK 1.4.
Also wird ab JDK 1.5 ein char[] mehr angelegt und ein System.arraycopy mehr ausgeführt.

Die Konkatenierung ist somit im JDK 1.5 nicht langsamer, wohl aber die Methode toString().
Das hat dann wiederum eine Auswirkung auf die + Methode bei Strings, da intern ja bei jedem + ein append und ein toString ausgeführt wird. Der Performanceverlust kommt also durch die neue toString Methode, hat aber den Vorteil, dass der Speicherplatzverbrauch geringer ist.
Bei künstlichen Tests merkt man diesen Unterschied deutlich, aber in wirklichen Applikationen hilft die günstigere Speicherplatznutzung widerum beim garbage collection (aber das ist ein kompliziertes Thema, über das ich vielleicht auch mal einen Artikel schreibe).

StringBuilder und StringBuffer unterscheiden sich dann nur noch darin, dass StringBuilde nicht synchronisiert ist. Das bringt bei normalen Desktop-Applikationen so gut wie nichts, da diese meist mehr oder weniger Single threaded sind, d.h. man hat auch nicht allzuviele Monitore, die man "synchronisieren" muss. Anders sieht es bei Server-Applikationen aus, z.B. bei Servlets mit vielen konkurrierenden Threads. Allerdings bringt das auch nicht wirklich viel.

Ich hoffe mal, dass war wenigstens etwas hilfreich.
 
G

Gast

Gast
Sehr schön ... aber wahrscheinlich hätte es ein Link ins JDK zur Klasse selber auch getan ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Performance bei "String <-> Byte"-Umwandlung Allgemeine Java-Themen 4
8u3631984 Frage Performance bei Linked List und Array List Allgemeine Java-Themen 5
H Performance einer Monte-Carlo-Simulation verbessern Allgemeine Java-Themen 6
goldmensch Datentypen Welche Methode hat die bessere Performance? Allgemeine Java-Themen 12
H Watson-Crick-Complement Performance Allgemeine Java-Themen 18
L Best Practice Auslagerung von Code = Performance Optimierung? Allgemeine Java-Themen 4
B Performance Messungen Allgemeine Java-Themen 4
J Threads verbessern die Performance NICHT ? Allgemeine Java-Themen 8
X Performance für Tomcat / Apache optimieren Allgemeine Java-Themen 2
I Performance - JDBC UPC PoolDataSoure Allgemeine Java-Themen 0
E Lambda filter performance Allgemeine Java-Themen 2
D Performance-Probleme mit Joda-Time Allgemeine Java-Themen 3
A Jasper Report Performance bei PDF erzeugen Allgemeine Java-Themen 0
A Best Practice Variablen vertauschen - Performance Allgemeine Java-Themen 1
R DBUnit Performance Probleme Allgemeine Java-Themen 0
P Performance: super explizit erwähnen oder weglassen? Allgemeine Java-Themen 5
S starke performance probleme des forums Allgemeine Java-Themen 10
C Performance Tips Allgemeine Java-Themen 13
A Performance/Speicherplatz-Nutzung bei Tests Allgemeine Java-Themen 6
R Java Performance testen Allgemeine Java-Themen 18
StrikeTom Java Performance Fragen Allgemeine Java-Themen 5
V Performance steigern Allgemeine Java-Themen 7
D Reflection-Performance Allgemeine Java-Themen 7
M Einfluss von Caching auf die Performance (große Arrays) Allgemeine Java-Themen 24
R Collections Performance einer HashMap Allgemeine Java-Themen 26
i<3java [Groovy/Grails](oder auch java) Mögliche Performance Probleme bei Mailversendung Allgemeine Java-Themen 2
D Performance Objektallokation Allgemeine Java-Themen 28
J Java Performance nicht nachvollziehbar Allgemeine Java-Themen 3
I Library für High Performance Mime Type Erkennung Allgemeine Java-Themen 8
S Performance Frage: Objekt oder static? Allgemeine Java-Themen 33
M Runtime.exec() - Performance / Frage zu Threads Allgemeine Java-Themen 5
M Performance Allgemeine Java-Themen 6
M Performance Allgemeine Java-Themen 5
E Performance website download Allgemeine Java-Themen 13
MQue Performance Methodenaufruf - if Abfrage Allgemeine Java-Themen 19
hdi Was frisst in meinem Programm den Speicher / verschlechtert die Performance Allgemeine Java-Themen 11
J Performance von Java GUI-Anwendungen Allgemeine Java-Themen 2
U Java Performance im Vergleich zu C++ in speziellem Anwendungsfall Allgemeine Java-Themen 6
S Performance und Function Call Depth Allgemeine Java-Themen 6
H Performance Vorteil durch Wechsel der JVM? Allgemeine Java-Themen 6
A Performance: byte[] in byte[][][] konvertieren Allgemeine Java-Themen 2
T Performance ArrayList#remove Allgemeine Java-Themen 8
ARadauer Performance Pptimierung -Lesen/Schreiben Allgemeine Java-Themen 10
Chris81T Performance Problem durch mehrfaches Starten eines JAVA Prog Allgemeine Java-Themen 8
G Hibernate, JTable und Performance Allgemeine Java-Themen 17
M Listener und Performance Allgemeine Java-Themen 9
P Performance: Ziehen ohne Zurücklegen (große Datenmenge) Allgemeine Java-Themen 10
D Performance: ArrayList vs. Array vs. "Eigene Liste&quot Allgemeine Java-Themen 8
M nichtreferenzierte Objekte auf NULL setzen -> Performance Allgemeine Java-Themen 4
S Ursache für schlechte Performance Allgemeine Java-Themen 2
L Java Performance Check Tool Allgemeine Java-Themen 3
S Performance von Comparator Allgemeine Java-Themen 3
egrath Performance Problem mit File-I/O Allgemeine Java-Themen 6
S Performance Problem Allgemeine Java-Themen 11
X Java Performance auf Sun Systemen bzw. generell Allgemeine Java-Themen 4
P miese performance bei nem BufferedImage + repaint :( Allgemeine Java-Themen 6
T Performance-Grundlagen Allgemeine Java-Themen 4
G Performance Problem bei der Übertragung Server zum Client Allgemeine Java-Themen 3
V Performance Leck finden Allgemeine Java-Themen 3
T Tile Game Performance Allgemeine Java-Themen 32
M Performance enorm langsam Allgemeine Java-Themen 26
F Performance von Reflection vs Statisches Coden Allgemeine Java-Themen 4
M Performance: Java zu C/C++ bei Datenbankanwendung Allgemeine Java-Themen 3
Y unnecessary cast & Performance Allgemeine Java-Themen 29
conan2 Performance von paint() Allgemeine Java-Themen 2
G Performance JDOM - DOM - eigene HashMap (SAX) Allgemeine Java-Themen 2
F Bilder als "Thumbnails" laden - Performance Allgemeine Java-Themen 6
S Java3D Performance optimieren Allgemeine Java-Themen 5
F Wenn ihr Performance wollt nehmt C++ Allgemeine Java-Themen 39
N Performance-Test (Geschwindigkeit von Methoden vergleichen)? Allgemeine Java-Themen 4
S Performance Test mit JMeter Allgemeine Java-Themen 2
T Performance Allgemeine Java-Themen 8
J Anfängerliste für gute Performance? Allgemeine Java-Themen 3
Luma Performance-Problem mit RandomAcces File Allgemeine Java-Themen 4
I Performance-Probleme bei Schleife Allgemeine Java-Themen 3
C Performance von FOR Schleifen Allgemeine Java-Themen 25
C Performance Vergleich, Java vs. Tcl/Tk Allgemeine Java-Themen 3
C EML Email Text in String wandeln Allgemeine Java-Themen 9
OnDemand Java String in Hashmap als Key NULL Allgemeine Java-Themen 27
JAnruVA Datentypen Berechneten String-Wert in Double umwandeln um weiter zu rechnen Allgemeine Java-Themen 7
M String Allgemeine Java-Themen 10
M Suche nach String mit unbekannten characters Allgemeine Java-Themen 53
kodela String kann nicht zu Pfad konvertiert werden Allgemeine Java-Themen 16
melaniemueller Einzelne Zeile aus einer txt Datei in einem String speichern Allgemeine Java-Themen 12
E Objekte in einen String packen und wieder laden Allgemeine Java-Themen 5
M Map<String,String>funktioniert nicht richtig Allgemeine Java-Themen 4
O String in Long Hexerdezimal umwandel Allgemeine Java-Themen 14
N String vergleichen. Allgemeine Java-Themen 27
P String.replace() funktioniert nicht? Allgemeine Java-Themen 3
SaschaMeyer Arbeitet String.split falsch? Allgemeine Java-Themen 4
M Switches ohne String Allgemeine Java-Themen 18
AmsananKING String Iteration Allgemeine Java-Themen 5
S Shuffle String aus if-clause Allgemeine Java-Themen 11
Besset Variablen Ist String = "" + int inordnung? Allgemeine Java-Themen 6
M Map <Long, String> zu Map<String, Long> Allgemeine Java-Themen 9
S String Encoding Verständnisproblem Allgemeine Java-Themen 22
N Prüfen, ob ein String 2x das selbe Zeichen hat Allgemeine Java-Themen 10
SaftigMelo Bug Fixen von String-spliten Allgemeine Java-Themen 8
Monokuma String List nach Zahlen und Worten sortieren Allgemeine Java-Themen 9
Kingamadeus2000 Alle mehrfach vorkommenden Buchstaben rekursiv aus einem String entfernen. Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben