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?
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.
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.
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.
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.
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:
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!
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.)
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.
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.).
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!)
Kurzum das wichtigste: char kann nicht den gesamten Unicode/UTF Raum abbilden welchen ein String halten kann, es kann also dabei zu Fehlern kommen in bestimmten Faellen.