Laut String # intern () soll die intern
Methode den String aus dem String-Pool zurückgeben, wenn der String im String-Pool gefunden wird. Andernfalls wird ein neues String-Objekt im String-Pool hinzugefügt und die Referenz dieses Strings zurückgegeben.
Also habe ich das versucht:
String s1 = "Rakesh";
String s2 = "Rakesh";
String s3 = "Rakesh".intern();
if ( s1 == s2 ){
System.out.println("s1 and s2 are same"); // 1.
}
if ( s1 == s3 ){
System.out.println("s1 and s3 are same" ); // 2.
}
Ich hatte erwartet, dass s1 and s3 are same
das gedruckt wird, wenn s3 interniert ist, und s1 and s2 are same
nicht gedruckt wird. Das Ergebnis ist jedoch: Beide Zeilen werden gedruckt. Das heißt, standardmäßig werden String-Konstanten interniert. Aber wenn ja, warum brauchen wir dann die intern
Methode? Mit anderen Worten, wann sollten wir diese Methode anwenden?
java
string
string-interning
Rakesh Juyal
quelle
quelle
intern
eine öffentliche Methode? Sollten wir nichtintern
als private Methode haben, damit niemand Zugriff darauf haben könnte. Oder gibt es einen Zweck dieser Methode?Antworten:
Java interniert automatisch String-Literale. Dies bedeutet, dass in vielen Fällen der Operator == für Strings genauso zu funktionieren scheint wie für Ints oder andere primitive Werte.
Da die Internierung für String-Literale automatisch erfolgt, ist die
intern()
Methode für Strings anzuwenden, die mit erstellt wurdennew String()
Anhand Ihres Beispiels:
wird zurückkehren:
In allen Fällen außer der
s4
Variablen, für die ein Wert explizit mit demnew
Operator erstellt wurde und fürintern
deren Ergebnis keine Methode verwendet wurde, handelt es sich um eine einzelne unveränderliche Instanz, die an den String-Konstantenpool von JVM zurückgegeben wird .Weitere Informationen finden Sie unter JavaTechniques "String Equality and Interning" .
quelle
String s1 = "Rakesh";
erster OB1String s4 = new String("Rakesh");
Zweite OB2 So Rest (s2, s3, s5) Referenz gleiches Objekt (OB 1) erstellt in ‚string Pool‘ So kann ich sagen , dass.intern()
Verfahren zum Verhindern , dass verwendeten neues Objekt zu erstellen , wenn gleiche Zeichenfolge instring pool
Falls Meine Annahme ist falsch, also gib mir die Richtung.In einem kürzlich durchgeführten Projekt wurden einige große Datenstrukturen mit Daten eingerichtet, die aus einer Datenbank eingelesen wurden (und daher keine String-Konstanten / Literale), jedoch mit einer großen Menge an Duplikaten. Es war eine Bankanwendung, und Dinge wie die Namen einer bescheidenen Gruppe (vielleicht 100 oder 200) tauchten überall auf. Die Datenstrukturen waren bereits groß, und wenn alle diese Unternehmensnamen eindeutige Objekte gewesen wären, wäre der Speicher übergelaufen. Stattdessen hatten alle Datenstrukturen Verweise auf dieselben 100 oder 200 String-Objekte, wodurch viel Platz gespart wurde.
Ein weiterer kleiner Vorteil von internierten Strings besteht darin,
==
dass sie (erfolgreich!) Zum Vergleichen von Strings verwendet werden können, wenn garantiert ist, dass alle beteiligten Strings interniert sind. Neben der schlankeren Syntax ist dies auch eine Leistungssteigerung. Aber wie andere haben darauf hingewiesen, dies zu tun Häfen ein großes Risiko von Programmierfehlern einzuführen, so sollte dies nur als desparate Maß der letzten Instanz durchgeführt werden.Der Nachteil ist, dass das Internieren eines Strings mehr Zeit in Anspruch nimmt als das einfache Werfen auf den Heap, und dass der Speicherplatz für internierte Strings je nach Java-Implementierung begrenzt sein kann. Dies geschieht am besten, wenn Sie mit einer bekannten vernünftigen Anzahl von Zeichenfolgen mit vielen Duplikaten zu tun haben.
quelle
The downside is that interning a String takes more time than simply throwing it on the heap, and that the space for interned Strings may be limited
Auch wenn Sie die interne Methode für die String-Konstante nicht verwenden, wird sie automatisch interniert.==
für Saiten zu.Ich möchte meine 2 Cent für die Verwendung
==
mit internierten Zeichenfolgen hinzufügen .Das erste, was
String.equals
tut, istthis==object
.Obwohl es einen winzigen Leistungsgewinn gibt (Sie rufen keine Methode auf), ist die Verwendung aus Sicht des Betreuers
==
ein Albtraum, da einige internierte Zeichenfolgen dazu neigen, nicht interniert zu werden.Daher empfehle ich, sich nicht auf den Sonderfall
==
für internierte Saiten zu verlassen, sondern immer so zu verwenden,equals
wie es Gosling beabsichtigt hat.EDIT: interniert wird nicht interniert:
In Version 2.0 hat sich der Betreuer entschlossen,
hasReferenceVal
öffentlich zu machen , ohne ins Detail zu gehen, dass er eine Reihe von internierten Zeichenfolgen erwartet.Jetzt haben Sie einen Fehler, der möglicherweise sehr schwer zu finden ist, da das Array in den meisten Fällen Literalwerte enthält und manchmal eine nicht-wörtliche Zeichenfolge verwendet wird. Wenn
equals
statt verwendet wurden ,==
dannhasReferenceVal
würde noch weiter haben zu arbeiten. Auch hier ist der Leistungsgewinn winzig, aber die Wartungskosten sind hoch.quelle
String-Literale und -Konstanten werden standardmäßig interniert. Das heißt,
"foo" == "foo"
(deklariert durch die String-Literale), abernew String("foo") != new String("foo")
.quelle
intern
,String literals and constants are interned by default
richtig ist.new String("foo")
-> Hier wird ein String-Literal "foo" im String-Pool und eines im Heap erstellt, sodass insgesamt 2 Objekte erstellt werden.Lernen Sie Java String Intern - ein für allemal
Strings in Java sind von Natur aus unveränderliche Objekte. Daher sind zwei Zeichenfolgenobjekte auch mit demselben Wert standardmäßig unterschiedliche Objekte. Wenn wir jedoch Speicherplatz sparen möchten, können wir angeben, dass derselbe Speicher von einem Konzept namens string intern verwendet wird.
Die folgenden Regeln helfen Ihnen dabei, das Konzept klar zu verstehen:
Beispiel:
Hinweis: Die Motivationsfälle für String-Praktikanten werden hier nicht behandelt. Das Speichern von Speicher wird jedoch definitiv eines der Hauptziele sein.
quelle
Sie sollten zwei Zeiträume erkennen, die Kompilierungszeit und Laufzeit sind. Zum Beispiel:
Einerseits stellen wir in Beispiel 1 fest, dass die Ergebnisse alle true zurückgeben, da der JVM in der Kompilierungszeit den "Test" in den Pool der Literalzeichenfolgen einfügt, wenn der JVM-Find "Test" vorhanden ist Es wird die vorhandene verwendet. In Beispiel 1 zeigen die "Test" -Strings alle auf dieselbe Speicheradresse, sodass in Beispiel 1 true zurückgegeben wird. Andererseits wird in Beispiel 2 die Methode von substring () zur Laufzeit ausgeführt. Im Fall von "test" == "! test" .substring (1) erstellt der Pool zwei Zeichenfolgenobjekte. " test "und"! test ", also sind sie verschiedene Referenzobjekte, daher gibt dieser Fall false zurück, im Fall von" test "=="! test ".substring (1) .intern (), der Methode von intern ( ) setzt den ""! test ".substring (1)" in den Pool der wörtlichen Zeichenfolgen,
quelle
http://en.wikipedia.org/wiki/String_interning
String-Internierung ist eine Methode zum Speichern nur einer Kopie jedes einzelnen String-Werts, der unveränderlich sein muss. Durch das Internieren von Zeichenfolgen werden einige Zeichenfolgenverarbeitungsaufgaben zeit- oder platzsparender, und es wird mehr Zeit benötigt, wenn die Zeichenfolge erstellt oder interniert wird. Die unterschiedlichen Werte werden in einem internen String-Pool gespeichert.
quelle
Internierte Strings vermeiden doppelte Strings. Durch das Internieren wird RAM auf Kosten einer höheren CPU-Zeit gespart, um doppelte Strings zu erkennen und zu ersetzen. Es gibt nur eine Kopie jeder Zeichenfolge, die interniert wurde, unabhängig davon, wie viele Verweise darauf verweisen. Da Strings unveränderlich sind, können zwei verschiedene Methoden, die zufällig denselben String verwenden, eine Kopie desselben Strings gemeinsam nutzen. Das Konvertieren doppelter Strings in gemeinsam genutzte Strings heißt interning.String.intern () gibt Ihnen die Adresse des kanonischen Master- Strings an . Sie können internierte Strings mit simple == (das Zeiger vergleicht) anstelle von equals vergleichenHier werden die Zeichen des Strings einzeln verglichen. Da Strings unveränderlich sind, kann der interne Prozess Platz sparen, indem beispielsweise kein separates String-Literal für "pot" erstellt wird, wenn es als Teilzeichenfolge eines anderen Literals wie "Hippopotamus" vorhanden ist.
Weitere Informationen finden Sie unter http://mindprod.com/jgloss/interned.html
quelle
AUSGABE
quelle
Wenn zwei Zeichenfolgen unabhängig voneinander erstellt werden,
intern()
können Sie sie vergleichen und eine Referenz im Zeichenfolgenpool erstellen, wenn die Referenz zuvor nicht vorhanden war.Wenn Sie verwenden
String s = new String(hi)
, erstellt Java eine neue Instanz der Zeichenfolge. Wenn Sie jedoch verwendenString s = "hi"
, prüft Java, ob der Code eine Instanz des Wortes "hi" enthält oder nicht, und wenn es vorhanden ist, gibt es nur die Referenz zurück.Da das Vergleichen von Zeichenfolgen auf Referenz basiert, können
intern()
Sie eine Referenz erstellen und den Inhalt der Zeichenfolgen vergleichen.Wenn Sie
intern()
den Code verwenden, wird der von der Zeichenfolge verwendete Speicherplatz gelöscht, der auf dasselbe Objekt verweist, und es wird nur die Referenz des bereits vorhandenen Objekts im Speicher zurückgegeben.Aber im Fall von p5, wenn Sie verwenden:
Es wird nur der Inhalt von p3 kopiert und p5 neu erstellt. Es ist also nicht interniert .
Die Ausgabe lautet also:
quelle
quelle
Die Methode string intern () wird verwendet, um eine exakte Kopie des Heap-String-Objekts im String-Konstantenpool zu erstellen. Die Zeichenfolgenobjekte im Zeichenfolgenkonstantenpool werden automatisch interniert, Zeichenfolgenobjekte im Heap jedoch nicht. Die Hauptanwendung beim Erstellen von Praktikanten besteht darin, Speicherplatz zu sparen und einen schnelleren Vergleich von Zeichenfolgenobjekten durchzuführen.
Quelle: Was ist String Intern in Java?
quelle
Wie Sie sagten, wird diese Zeichenfolgenmethode
intern()
zuerst aus dem Zeichenfolgenpool gefunden. Wenn sie gefunden wird, gibt sie das Objekt zurück, das darauf verweist, oder fügt dem Pool eine neue Zeichenfolge hinzu.Das
s1
unds2
sind zwei Objekte, die auf den String-Pool "Hallo" zeigen, und mit"Hello".intern()
wird dass1
und gefundens2
. Also"s1 == s3"
kehrt true zurück, ebenso wie zums3.intern()
.quelle
Wenn wir die Heap-Objektreferenz verwenden, um die entsprechende Objektreferenz für den String-Konstantenpool zu erhalten , sollten wir uns für intern () entscheiden.
Bildansicht
Schritt 1: Objekt mit Daten 'Rakesh' wird im Heap- und String-Konstantenpool erstellt. Außerdem zeigt s1 immer auf ein Heap-Objekt.
Schritt 2: Mit der Heap-Objektreferenz s1 versuchen wir, die interne String-Konstanten-Pool-Objektreferenz s2 mit intern () abzurufen.
Schritt 3: Absichtlich ein Objekt mit den Daten 'Rakesh' im String-Konstanten-Pool erstellen, auf das mit dem Namen s3 verwiesen wird
Als "==" Operator für Referenzvergleich gedacht.
Erste falsch für s1 == s2
Erste wahr für s2 == s3
Ich hoffe das hilft!!
quelle