wie der subString () - Funktion der string-Klasse funktioniert
finden Sie in der folgenden code.
String s = "Monday";
if(s.subString(0,3).equals("Mon"){}
String s2 = new String(s.subString(0,3));
String s3 = s.subString(0,3);
Ich weiß, dass Zeile 2 wird immer noch auf "Montag" und haben ein neues String-Objekt mit dem offset und count legen um 0,3.
Zeile 4 erstellen Sie eine neue Zeichenfolge "Mon" in der string-pool und Punkt.
Aber nicht sicher, was ist mit Zeile 5, ob es sich Verhalten wird wie die Linie 2 oder Linie 4.
Wenn ich falsch bin für Linie 2 oder 4 bitte auch korrekt.
Ich Frage mich, wo meine Antwort geblieben ist. Dann erkannte ich, antwortete ich auf die Ranch. 🙂
Diese Methode der String geschrieben wird kleingeschrieben: substring()
Diese Methode der String geschrieben wird kleingeschrieben: substring()
InformationsquelleAutor harshit | 2009-04-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Derzeit gilt für die Sun JRE Umsetzung. Ich scheine zu erinnern, dass nicht wahr war von der Sonne die Umsetzung in der Vergangenheit, und nicht wahr, von anderen Implementierungen der JVM. Verlassen Sie sich nicht auf Verhaltensweisen, die nicht angegeben. GNU classpath könnte, kopieren Sie den array (ich kann mich nicht erinnern, aus der hand welchem Verhältnis wird verwendet, um zu entscheiden, Wann Sie zu kopieren, aber es nicht kopieren, wenn die Kopie einen genügend kleinen Bruchteil des Originals, das sich eine schöne O(N) Algorithmus zu O(N^2)).
Nein, es erzeugt ein neues string-Objekt im heap, unterliegen den gleichen garbage collection Regeln wie für jedes andere Objekt. Ob oder nicht, es teilt die gleichen zugrunde liegenden Zeichen-array, ist von der Implementierung abhängig. Verlassen Sie sich nicht auf Verhaltensweisen, die nicht angegeben.
Den
String(String)
Konstruktor sagt:Den
String(char[])
Konstruktor sagt:Folgende gute OO-Prinzipien, keine Methode der
String
eigentlich erfordert, dass es implementiert ist, mit einem Zeichen-array, so dass kein Teil der SpezifikationString
erfordert Vorgänge auf ein Zeichen-array. Diese Operationen, die ein array als Eingabe angeben, dass die Inhalt des Arrays kopiert werden, was die interne Speicherung verwendet wird, in der Zeichenfolge. Ein string könnte die Verwendung von UTF-8 oder LZ-Komprimierung intern und entsprechen der API.Allerdings, wenn Sie Ihre JVM nicht machen, die kleinen-Verhältnis sub-string-Optimierung, dann gibt es eine chance, dass es funktioniert kopieren Sie nur die relevanten Teile wenn Sie
new String(String)
, so ist es ein Fall von versuchen, es zu sehen, ob es verbessert die Speichernutzung. Nicht alles, was Effekte Java runtimes ist definiert durch Java.Erhalten Sie eine Zeichenfolge im string-pool ist
equal
eine Zeichenfolge, verwenden Sie dieintern()
Methode. Dies wird entweder abrufen, eine Zeichenfolge, die aus dem pool, wenn man mit dem Wert, der bereits interniert, oder erstellen Sie eine neue Zeichenfolge, und legen Sie es in den pool. Beachten Sie, dass gepoolte Saiten haben unterschiedliche (wieder-Implementierung abhängig) garbage collection-Verhalten.Wie jedes Objekt in Java, es ist gespeichert in den Haufen, bis es nicht mehr referenziert wird, und ist dann Müll gesammelt, irgendwann. Alle Implementierungen, die ich gesehen habe verwenden Sie ein char-array zum speichern der Zeichen in der Zeichenfolge, und einige haben unterschiedliche Regeln für die gemeinsame Nutzung dieses array zwischen Saiten...
... aber ich kann mich nicht erinnern eine, wo die Zeichenfolge(String) nicht mit dem array wird die Länge der neuen Zeichenfolge. Also das array wird intern durch das argument darf kopiert oder referenziert werden können, aber die Umsetzung.
InformationsquelleAutor Pete Kirkham
Wie schon von Pete Kirkham, das ist die Umsetzung-spezifisch. Meine Antwort ist nur richtig für die Sun JRE, und nur vor Java 7 update 6.
Du hast Recht über einen normalen
substring
rufen Sie einfach erstellen Sie eine neue Zeichenfolge beziehen sich auf die gleichen Zeichen-array als die ursprüngliche Zeichenfolge. Das ist, was passiert auf der Linie 5 zu. Die Tatsache, dass das neue string-Objekt-Referenz geschieht mit einer Variablen zugewiesen werden sich nicht ändern, das Verhalten der Methode.Nur um klar sein, Sie sagen, dass in Zeile 2 wird der neue string wird immer noch auf "Montag" - das char-array Referenz innerhalb der Zeichenfolge werden auf die gleiche char-array als einer für den "Montag". Aber "Montag" ist ein string an sich, nicht ein char-array. In anderen Worten, durch die Zeit, die Linie 2 abgeschlossen hat (und ignorieren GC) es gibt zwei string-Objekte, die beide auf der gleichen char-array. Man hat eine Anzahl von 6 und das andere hat eine Anzahl von 3; beide haben ein offset von 0.
Du bist falsch über die Linie 4 mit "string-pool" obwohl - es gibt kein pooling geht. Es ist jedoch anders als die der anderen Linien. Beim Aufruf der
String(String)
Konstruktor, wird der neuen string-nimmt ein kopieren von den Charakter-Daten der original, also komplett separate. Dies kann sehr nützlich sein, wenn Sie nur eine Zeichenfolge, die enthält ein kleines Teil einer sehr großen ursprünglichen Zeichenkette; es ermöglicht die original großes char-array, um eine garbage Collection ausgeführt werden (vorausgesetzt, dass nichts anderes es braucht), während Sie halten auf die Kopie von dem kleinen Teil. Ein gutes Beispiel dafür aus meiner eigenen Erfahrung ist das Lesen von Zeilen aus einer Linie. StandardmäßigBufferedLineReader
Lesen werden Zeilen mit 80-Zeichen-Puffer, so dass jeder string, der zurückgegeben wird, verwenden Sie ein char-array von mindestens 80 Zeichen. Wenn Sie Lesen hier sehr viele kurze Linien (einzelne Wörter) ist der Unterschied in Bezug auf Speicher-Verbrauch nur durch die Nutzung der seltsam aussehendekann sehr bedeutend sein.
Hilft das?
Siehe mein Beitrag. Dies wird durch die Implementierung definiert und variiert.
Guter Punkt - Bearbeiten, um das klar zu machen.
Ab Java 7 update 6, das Sun-JRE verschrottet die array-sharing-Verhalten.
Vielen Dank, bearbeitet das Fett etwas.
InformationsquelleAutor Jon Skeet
Hinweis: ab Java 7 update 6 Sun/Oracle-Java, es ist nicht mehr wahr, dass ein String erstellt von String.substring Aktien des Mutterunternehmens char-array. Es wurde beschlossen, dass diese Optimierung nur selten war vorteilhaft, und nicht zu rechtfertigen die Kosten und die Komplexität der
offset
undcount
Felder.Einige links:
InformationsquelleAutor Boann
In Zeile 5---->s3=Mo .
InformationsquelleAutor Warrior
In Suns Implementierung von String-Objekten ein
private final char value[]
Feld. Wenn Sie erstellen Sie einen neuen String durch Aufruf von substring () wird kein neues char-array erstellt wird, die neue Instanz verwendet, dievalue
des ursprünglichen Objekts. Dies ist der Fall in Zeile 2 und 5, das neue String-Objekte werden mit den char-array von s.Den Konstruktor String(String) erzeugt ein neues char-array bei der die Länge der Zeichenfolge kleiner als die gesamte Länge des char-array
value
. Also die Zeichenfolge erstellt, in Zeile 4 wird ein neues char-array.Sollten Sie einen Blick auf die source code der Konstruktor public String(String original), ist es wirklich einfach.
InformationsquelleAutor Chei
"Substring erzeugt ein neues Objekt aus dem Quell-Zeichenfolge, indem Sie einen Teil der ursprünglichen Zeichenfolge".
Bis Java 1.7, substring enthält die Referenz der ursprünglichen Zeichen-array, das bedeutet noch einen sub-string 5 Zeichen lang ist, kann es verhindern, 1GB Zeichen-array vom garbage collection, indem eine starke Referenz.
Dieses Problem wird behoben, in Java 1.7, wo die ursprünglichen Zeichen-array nicht mehr referenziert, aber das ändern auch die Schaffung von substring wenig teuer in Bezug auf die Zeit. Früher war es im Bereich von O(1), die O(n) im worst case auf Java 7.
InformationsquelleAutor amitkumar12788
Lesen Sie diese http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html
InformationsquelleAutor Tobias