Zeichenkette teilen mit Substring oder Char Array

Anfaengerin

Mitglied
Hey,

ich will eine Zeichenkette teilen und zwar so, dass ich zwei Teile zurückbehalte, die (je) am Anfang und am Ende einer Zeile stehen. Ist da substring oder Char Array günstiger?
 

Marinek

Bekanntes Mitglied
Also ein Substring ist ein String. Dieser besteht aus einem Char-Array. Daher verstehe ich die Frage nicht. Werde auch keinen Versuch starten zu raten.

Genereller Hinweis: Bei zwei Alternativen, würde ich beides ausprobieren. Anschließend kann man sich dann ein Urteil über Kosten machen.

Das ist gerade bei Anfängern super wichtig. Ausprobieren und machen. Beides ist zunächstmal günstig.
 

Barista

Top Contributor
Ist da substring oder Char Array günstiger?

Die Frage ist, 'günstiger' unter welcher Bedingung.

char Array könnte etwas schneller sein und weniger Speicher verbrauchen, weil ein String-Objekt das char Array noch mal verpackt.

String (substring) wäre günstiger bezüglich des Aufwandes zum Schreiben und Lesen des Codes.

Für Anfänger ist der Aufwand zum Schreiben und Lesen des Codes sicher wichtiger.
 

mihe7

Top Contributor
char Array könnte etwas schneller sein und weniger Speicher verbrauchen, weil ein String-Objekt das char Array noch mal verpackt.
Was den Speicher betrifft, liegt die Betonung auf "könnte". Wenn ich mich recht entsinne, ist ein Substring einfach eine "View" auf den ursprünglichen String, so dass der Speicherbedarf nach "wenigen" Zeichen zugunsten von String ausfallen dürfte.
 

Marinek

Bekanntes Mitglied
Was den Speicher betrifft, liegt die Betonung auf "könnte". Wenn ich mich recht entsinne, ist ein Substring einfach eine "View" auf den ursprünglichen String, so dass der Speicherbedarf nach "wenigen" Zeichen zugunsten von String ausfallen dürfte.
Wie meinst du das? in Java gibt es keinen Substring als Klasse. Die Methode liefert einen String.
In Java sind Strings in einem Pool gespeichert und werden wiederverwendet.
 

Oneixee5

Top Contributor
Java maintains a special area in the Java heap called the string pool (also known as the intern pool). This is where all literal strings are stored. When a new string literal is created, Java checks the string pool first. If an identical string already exists, the new variable will reference the existing string. If not, a new string is created in the pool.

Dieser Fall passt ja nicht, jedenfalls nur sehr selten. Man muss hier davon ausgehen, dass es keinen identischen String gibt. String ist unveränderlich, also kann eine Substring auf einen Speicherbereich eines Strings zeigen. Wird der ursprüngliche String entsorgt geht der Substring trotzdem nicht verloren. Der Speicher wird dann nicht freigegeben. Das sind aber JVM-Internas. Diese sollten bei der normalen Verwendung keine Rolle spielen, zumal die Handhabung in verschieden JVM's unterschiedlich sein kann.
Der Fall ist ganz einfach: Solche Optimierung sind der Anfang allen Übels. Von Microoptimierungen sollte man ganz die Hände lassen. Quellcode ist für Menschen, diese müssen ihn lesen und ändern können. Den Rest kann man, gerade als Anfänger, getrost dem Compiler, Optimizer und der Runtime überlassen. Code wird in jeder Phase der Ausführung und über die Laufzeit optimiert. Also schreibe Code so, dass du ihn gut lesen und verstehen kannst.

Ich denke in etwa so wäre es gut lesbar:
Java:
String[] twoHalves(String value) {
    int mid = value.length() / 2;
    return {
        value.substring(0, mid),
        value.substring(mid)
    };
}
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Wie meinst du das? in Java gibt es keinen Substring als Klasse. Die Methode liefert einen String.
Mit "Substring" meinte ich keine Klasse, sondern den String, der von einer der substring-Methoden zurückgegeben wird.

Aber, ich habe eben nachgesehen: ich hatte das falsch im Kopf. Der entsprechende Teil des Arrays wird kopiert.
 

KonradN

Super-Moderator
Mitarbeiter
In Java sind Strings in einem Pool gespeichert und werden wiederverwendet.
Das ist nicht ganz korrekt oder zumindest ungenau. Es gibt einen String Pool. In dem sind aber nicht alle Strings. Das wäre auch extrem dumm, denn dann würden alle Strings für immer im Speicher verbleiben.

In dem String Pool sind nur "internalized" Strings. Also Strings, auf denen intern() aufgerufen wurde. Das ist für alle String Literale der Fall (So dass ein String Literal nur einmal im Speicher ist, egal wie oft und wo es verwendet wurde).

Strings, die keine Literale sind (Also z.B. das Ergebnis von substring Aufrufen) sind also erst einmal nicht in dem Pool. Das kann man auch gerne einmal testen:
Java:
        String literal = "abcdefghijklmn";
        String sub1 = literal.substring(3);
        String sub2 = literal.substring(3);
        System.out.println(sub1 == sub2);

Das liefert false, den sub1 und sub2 sind eben nicht in dem String Pool.

Wenn wir es aber anpassen würden:
Java:
        String literal = "abcdefghijklmn";
        String sub1 = literal.substring(3).intern();
        String sub2 = literal.substring(3).intern();
        System.out.println(sub1 == sub2);

Durch die intern() Aufrufe wird der String im String Pool abgelegt und man bekommt die Referenz aus dem String Pool. Da jeder String nur einmal abgelegt wird, sind nun die Referenzen in sub1 und sub2 gleich.

Edit: Bitte den wichtigen Hinweis von @Barista beachten in #12. In Kurz: Bitte kein String.intern() nutzen! Das dürfte in den meisten Fällen keine gute Lösung/Idee sein!
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Sorry, dass ich die Diskussion zur Thematik "Effektivität" direkt unterbinde. Zu diesem Thema gibt es genug Threads und wir müssen diese Thematik hier nicht erneut führen. Dies kann gerne als separater Thread gestartet werden, wenn jemand da Bedarf sieht und in der Lage ist, eine sachlichen Diskussion zu führen. (Der Bedarf ist vermutlich nur bei Tobias gegeben, aber da ist die sachliche Diskussion ja nicht gegeben.)
 

Marinek

Bekanntes Mitglied
Das ist nicht ganz korrekt oder zumindest ungenau. Es gibt einen String Pool. In dem sind aber nicht alle Strings. Das wäre auch extrem dumm, denn dann würden alle Strings für immer im Speicher verbleiben.
Ja das ist korrekt. Gegeben der etwas oberflächlichen und noch ungenaueren Frage, wollte ich auch nicht auf die Funktion des Pools hinaus, sondern nur auf die Tatsache, dass es ihn gibt und hier insgesammt das Wording "Substring" und "View" merkwürdig verwendet worden sind.

Aber danke für die Klarstellung ;)
 

Barista

Top Contributor
Durch die intern() Aufrufe wird der String im String Pool abgelegt und man bekommt die Referenz aus dem String Pool.
Ich habe übrigens letztens einen Post oder Artikel von Andre Shipilev (Entschuldigung, sicher falsch geschrieben) gelesen, dass man String#intern nicht benutzen sollte, sondern bei Bedarf einen eigenen String-Pool (HashMap) benutzen sollte, den man dann auch selbst unter Kontrolle hat (was rein kommt und was draußen bleibt, wie lange er im Speicherbleibt usw.).
 

KonradN

Super-Moderator
Mitarbeiter
Ich habe übrigens letztens einen Post oder Artikel von Andre Shipilev (Entschuldigung, sicher falsch geschrieben) gelesen, dass man String#intern nicht benutzen sollte, sondern bei Bedarf einen eigenen String-Pool (HashMap) benutzen sollte, den man dann auch selbst unter Kontrolle hat (was rein kommt und was draußen bleibt, wie lange er im Speicherbleibt usw.).
Ja, das macht auch wirklich Sinn. Und ich wollte eigentlich ganz gross und dick mit rein schreiben in den Post, dass man intern() nicht nutzen sollte. Ich denke, das editiere ich noch rein. Danke für diesen sehr guten Hinweis!

(Ich musste bei dem Post daran denken, dass wir mal einen Thread hier im Forum hatten, wo der TE (Edit: des damaligen Threads, nicht der TE dieses Thread!) es als gute Lösung empfand, intern() für Vergleiche zu nutzen. Also statt einem ìf (string1.equals(string2)) fand er ein if (string1.intern() == string2.intern()) besser ... Und das ist - um es ganz deutlich zu sagen - absoluter Müll/Quatsch!)
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
H String-Operation replace() - Zeichenkette verdoppeln Java Basics - Anfänger-Themen 2
F wie kann ich die Position des letzten Vokals innerhalb einer Zeichenkette ermitteln? Java Basics - Anfänger-Themen 5
O Ich ahbe einen char und diesen soll ich bei .matches prüfen, also ob der char in meiner Zeichenkette vorhanden ist, wie mache ich das? Java Basics - Anfänger-Themen 9
nonickatall Input/Output Zeichenkette in Array zerlegen Java Basics - Anfänger-Themen 2
M Erste Schritte Zeichenkette zerlegen Java Basics - Anfänger-Themen 5
V Zeichenkette programmieren Java Basics - Anfänger-Themen 20
H Methoden Zeichenkette Java Basics - Anfänger-Themen 4
P Zeichenkette Zeichen ausschlißen funktioniert nicht richtig Java Basics - Anfänger-Themen 9
M Zeichenkette konvertieren Java Basics - Anfänger-Themen 1
B Array Zeichenkette umkehren Java Basics - Anfänger-Themen 6
P Zeichenkette mit Binärzahl in Dezimalzahl umrechnen Java Basics - Anfänger-Themen 3
L Zeichenkette zerlegen Java Basics - Anfänger-Themen 4
H Wie wandel ich ein Datum in eine Zeichenkette um mit StringBuffer? Java Basics - Anfänger-Themen 3
X Methoden Bei Arrayausgabe wird eine nichtdefinierte Zeichenkette/Anhängsel ausgegeben Java Basics - Anfänger-Themen 7
G Erste Schritte Suche nach Zeichenkette Java Basics - Anfänger-Themen 26
M Methoden String methoden ,Häufigkeit einm wort in der Zeichenkette Java Basics - Anfänger-Themen 14
S "über Parameter soll zeichenkette übergeben werde" Java Basics - Anfänger-Themen 48
P Textdatei auf erste Zeichenkette Prüfen... Java Basics - Anfänger-Themen 10
B zeichenkette in ganze zahlen Java Basics - Anfänger-Themen 2
A UserInput (Eingabe in Form einer Zeichenkette) Java Basics - Anfänger-Themen 11
B Zeichenkette? Java Basics - Anfänger-Themen 7
C Variable Zeichenkette innerhalb einer Schleife ersetzen Java Basics - Anfänger-Themen 4
T Zeichenkette generieren lassen Java Basics - Anfänger-Themen 6
G Zeichenkette in char-Array konvertieren Java Basics - Anfänger-Themen 13
G Zeichenkette suchen in Vector-Klasse Java Basics - Anfänger-Themen 11
D Zeichenkette in String löschen Java Basics - Anfänger-Themen 4
T charAt funktion mit einer string zeichenkette nutzen. WIE? Java Basics - Anfänger-Themen 13
B Bestimmte Zeichenkette aus String herausschneiden? Java Basics - Anfänger-Themen 8
E Zeichenkette Java Basics - Anfänger-Themen 14
G Zeichenkette anhand einer anderen Zeichenkette trennen Java Basics - Anfänger-Themen 6
C Ziffernabfrage in Zeichenkette ! Java Basics - Anfänger-Themen 18
J Zahlen aus Zeichenkette rausparsen? Java Basics - Anfänger-Themen 4
S Zeichenkette zerlegen? Java Basics - Anfänger-Themen 4
F Problem mit Zeichenkette nur aus Leerzeichen Java Basics - Anfänger-Themen 4
E Zeichenkette einlesen Java Basics - Anfänger-Themen 2
N geschachtelte ausgabe einer zeichenkette Java Basics - Anfänger-Themen 5
G Eingabe einer Zeichenkette ? Java Basics - Anfänger-Themen 2
J Boolean[] teilen Java Basics - Anfänger-Themen 13
S Teilen ohne Rest Java Basics - Anfänger-Themen 15
O Datentypen String teilen Java Basics - Anfänger-Themen 5
A Teilen eines Arrays Java Basics - Anfänger-Themen 5
J Eine Position im String durch einen Integer - Wert teilen Java Basics - Anfänger-Themen 5
N Eine Zahl solange teilen bis es nicht möglich ist und die Ergebnisse ausgeben Java Basics - Anfänger-Themen 23
H OOP eine Zahl immer weiter durch 2 teilen Java Basics - Anfänger-Themen 15
M Suchfunktion schon bei Teilen des Wortes Java Basics - Anfänger-Themen 4
F Wie String in unterschiedliche Listen teilen Java Basics - Anfänger-Themen 7
R Image Teilen Java Basics - Anfänger-Themen 3
V Durch 0 teilen Java Basics - Anfänger-Themen 2
H Schleife für Teilen mit Rest Java Basics - Anfänger-Themen 1
I String teilen und zwei Wörter generieren Java Basics - Anfänger-Themen 1
A Text teilen und Wörter zählen Java Basics - Anfänger-Themen 7
T Android Display in 4 teilen... Java Basics - Anfänger-Themen 3
H Datei in kleine Stücke teilen und wieder erkennen Java Basics - Anfänger-Themen 10
C Durch 0 teilen Java Basics - Anfänger-Themen 11
turmaline String teilen in gleich große strings Java Basics - Anfänger-Themen 15
N TextZeile in einzelne Strings teilen, die mit Komma getrennt sind Java Basics - Anfänger-Themen 4
X Quersumme ganzzahlig teilen problem Java Basics - Anfänger-Themen 9
S Zeichenketten teilen Java Basics - Anfänger-Themen 13
A Fahrzeug ID in substrings teilen und abgleichen Java Basics - Anfänger-Themen 9
M Ganzzahlig teilen Java Basics - Anfänger-Themen 1
F Teilen mit Rest Java Basics - Anfänger-Themen 12
Guybrush Threepwood String in alle möglichen Fragmente teilen Java Basics - Anfänger-Themen 2
A eingelesene String in buchstaben teilen Java Basics - Anfänger-Themen 9
X String teilen Java Basics - Anfänger-Themen 1
D String mit split teilen und leere Felder behalten Java Basics - Anfänger-Themen 4
G Array rekursiv teilen und aufsummieren Java Basics - Anfänger-Themen 9
K Durch 0 teilen Java Basics - Anfänger-Themen 4
F Teilen einer großen Grafik Java Basics - Anfänger-Themen 2
D String teilen die x-te Java Basics - Anfänger-Themen 13
K Durch null teilen?? Java Basics - Anfänger-Themen 3
S Substring in java Java Basics - Anfänger-Themen 3
Hzrfa S.substring Java Basics - Anfänger-Themen 38
Substring in einem String finden Java Basics - Anfänger-Themen 13
MasterNO substring in array Java Basics - Anfänger-Themen 1
P Methoden Namen trennen mit .substring(), char.At(), .lenght() Java Basics - Anfänger-Themen 8
A startsWith method und substring Java Basics - Anfänger-Themen 2
W Substring Array Java Basics - Anfänger-Themen 1
B substring() maximale Zeichenlänge festlegen? Java Basics - Anfänger-Themen 1
D Substring wiederholen Java Basics - Anfänger-Themen 33
M "substring()" mit Dateien und Pfadangaben Java Basics - Anfänger-Themen 5
Z Pattern und Matcher substring zu String möglich? Java Basics - Anfänger-Themen 4
Y Substring Java Basics - Anfänger-Themen 10
F SubString in String zählen Java Basics - Anfänger-Themen 3
A Länge Substring Java Basics - Anfänger-Themen 1
S Substring - String index out of range Java Basics - Anfänger-Themen 11
A Probleme mit Substring Java Basics - Anfänger-Themen 2
L String.contains() - substring erstellen Java Basics - Anfänger-Themen 3
H Frage zu Substring(old, new) Java Basics - Anfänger-Themen 3
S String index out of range: 8 at java.lang.String.substring(Unknown Source) Java Basics - Anfänger-Themen 13
I Substring für ne Liste Java Basics - Anfänger-Themen 6
P Erste Schritte vergleich substring und string Java Basics - Anfänger-Themen 4
C Substring aus String - \n nicht beachten Java Basics - Anfänger-Themen 12
B String Methoden ! substring,indexOf,length... :( Java Basics - Anfänger-Themen 5
F String substring Java Basics - Anfänger-Themen 15
F Substring mittels RegEx ermitteln/ersetzen? Java Basics - Anfänger-Themen 2
D substring entfernt zuviele Zeichen Java Basics - Anfänger-Themen 16
G Java substring vereinfachen Java Basics - Anfänger-Themen 19
L Substring? Java Basics - Anfänger-Themen 5
B Problem mit substring Java Basics - Anfänger-Themen 3
J Substring zwischen Anführungszeichen finden Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben