Wann sollten wir die interne Methode von String für Stringliterale verwenden?
Laut String#intern(), intern
Methode soll den String aus dem String-pool, wenn die Zeichenfolge gefunden, die in der String-pool, andernfalls wird ein neues string-Objekt Hinzugefügt werden in der String-pool und die Referenz dieser String wird zurückgegeben.
Also versuchte ich Folgendes:
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.
}
Erwartete ich, dass s1 and s3 are same
wird so gedruckt, als s3 interniert ist, und s1 and s2 are same
wird nicht gedruckt. Aber das Ergebnis ist: beide Linien werden gedruckt. Das heißt also, standardmäßig String-Konstanten werden interniert. Aber wenn es so ist, dann warum brauchen wir die intern
Methode? In anderen Worten, wenn sollten wir diese Methode benutzen?
intern
als öffentliche Methode. Sollten wir nicht mit intern
als private Methode, so, dass niemand Zugriff darauf haben. Oder ist es Zweck dieser Methode? InformationsquelleAutor der Frage Rakesh Juyal | 2009-12-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Java automatisch Praktikanten String-Literale. Dies bedeutet, dass in vielen Fällen der = = - operator wird zu arbeiten für Zeichenfolgen in der gleichen Weise, dass es nicht für ints oder andere primitive Werte.
Da Praktikum erfolgt automatisch für String-Literale, die
intern()
Methode, die verwendet werden auf Strings konstruiert mitnew String()
Mit Ihrem Beispiel:
zurück:
Finden JavaTechniques "String-Gleichheit und Praktikum" für weitere Informationen.
InformationsquelleAutor der Antwort Miguel Fonseca
Auf einem aktuellen Projekt, einem riesigen Daten-Strukturen wurden eingerichtet, die die Daten, gelesen von einer Datenbank (und damit nicht als String-Konstanten/Literale), aber mit einer riesigen Menge von Doppelarbeit. Es war eine banking-Anwendung, und Dinge wie die Namen einer Reihe (vielleicht 100 oder 200) Unternehmen offenbar alle über dem Platz. Die Datenstrukturen wurden bereits groß, und, wenn all diese corp Namen wurden einzigartige Objekte, die Sie hätte übergelaufen Speicher. Stattdessen werden alle Daten, Strukturen, Verweise auf die gleichen 100 oder 200 String-Objekte, und spart somit viel Platz.
Anderen kleinen Vorteil interniert-Strings ist, dass
==
verwendet werden können (erfolgreich!) um Zeichenketten miteinander zu vergleichen, wenn alle beteiligten strings sind garantiert interniert. Abgesehen von den schlankeren syntax, dies ist auch eine Leistungssteigerung. Aber wie andere haben darauf hingewiesen, tun dies birgt die große Gefahr der Einführung Fehler in der Programmierung, so sollte dies nur getan werden, als einen verzweifelten Maßnahme der letzten Instanz.Der Nachteil ist, dass ein Praktikum eine Zeichenfolge länger dauert, als einfach werfen Sie es über den Haufen, und, dass der Raum für die Internierten Strings begrenzt werden kann, je nach Java-Implementierung. Es ist am besten getan, wenn Sie den Umgang mit einem bekannten angemessene Anzahl von Strings mit vielen überschneidungen.
InformationsquelleAutor der Antwort Carl Smotricz
Möchte ich hinzufügen, meine 2 cents über die Verwendung
==
mit Internierten strings.Das erste, was
String.equals
tut, istthis==object
.So, obwohl es gibt einige winzige Leistung zu gewinnen ( Sie nicht den Aufruf einer Methode), der von der maintainer-Sicht mit
==
ist ein Alptraum, weil einige Internierten strings haben eine Tendenz zu nicht-interniert.Also ich schlage vor, nicht darauf zu verlassen, auf den speziellen Fall der
==
für die Internierten strings, sondern immerequals
als Gosling soll.EDIT: interniert immer nicht interniert:
In der version 2.0 Betreuers entschieden
hasReferenceVal
öffentlichkeit, ohne dabei zu weit ins detail, dass es erwartet ein array von strings interniert.Nun haben Sie einen bug, der möglicherweise sehr schwer zu finden, weil in der Mehrheit der Fälle array enthält Literale Werte, und manchmal ist ein nicht-literalen Zeichenfolge verwendet. Wenn
equals
verwendet wurden anstelle von==
dannhasReferenceVal
haben würde, noch weiter zu arbeiten. Wieder einmal, performance-Gewinn ist verschwindend klein, aber die Instandhaltungskosten sind hoch.InformationsquelleAutor der Antwort Alexander Pogrebnyak
String-Literale und Konstanten werden interniert standardmäßig.
Das ist
"foo" == "foo"
(erklärt durch die String-Literale), abernew String("foo") != new String("foo")
.InformationsquelleAutor der Antwort Bozho
sollten Sie sich beiden Zeit, die compile-Zeit und Laufzeit-Zeit.zum Beispiel:
in der einen hand,im Beispiel 1,die wir finden, die Ergebnisse sind alle true zurück,da in der compile-Zeit der jvm wird der "test", um den pool von literalen strings verwendet werden,wenn die jvm finden "test" vorhanden ist,dann wird es die existiert,im Beispiel 1,der "test" - Saiten sind alle auf den gleichen Speicher-Adresse,so dass das Beispiel 1 wird true zurückgegeben.
in der anderen hand,im Beispiel 2,die Methode substring() ausführen, in der Laufzeit, Uhrzeit,
im Fall von "test" == "!testen".substring(1),der pool wird erstellen Sie zwei string-Objekt,"test"
und "!test",so dass Sie verschiedene Referenz-Objekte,also in diesem Fall den Wert false zurück,im Fall von "test" == "!testen".substring(1).intern(),die Methode intern () "setzen Sie die""!testen".substring(1)", um den pool von literal-Zeichenfolgen,so dass in diesem Fall,Sie sind die gleichen Objekte referenziert,so wird true zurückgegeben.
InformationsquelleAutor der Antwort thinkinjava
http://en.wikipedia.org/wiki/String_interning
string Praktikum ist eine Methode der Speicherung nur eine Kopie von jedem eindeutigen Zeichenfolge, die müssen unveränderlich sein. Praktikum Saiten macht einige string-Bearbeitung der Aufgaben mehr Zeit - oder Raum-effizient bei den Kosten erfordern mehr Zeit, als der string erstellt wird oder interniert. Die unterschiedlichen Werte sind gespeichert in einer string-intern-pool.
InformationsquelleAutor der Antwort bbcbcgb
Interniert Saiten vermeiden Sie doppelte Strings. Praktikum spart RAM auf Kosten von mehr CPU-Zeit zu erkennen und ersetzen, doppelte Strings. Es ist nur eine Kopie von jedem String, der wurde interniert, egal wie viele Referenzen verweisen. Da Zeichenfolgen unveränderlich sind, wenn zwei verschiedene Methoden übrigens verwenden Sie denselben String, können Sie eine Kopie der gleichen Zeichenfolge. Der Prozess der Umwandlung von Zeichenketten dupliziert, um gemeinsame diejenigen genannt wird Praktikum.String.Praktikant (in) gibt Sie die Adresse des kanonischen master-String. Vergleichen Sie interniert Strings mit einfachen == (vergleicht Zeiger) statt gleich vergleicht die Zeichen des Strings einzeln. Da Zeichenfolgen unveränderlich sind, die intern Prozess ist frei, um weiteren Speicherplatz zu sparen, zum Beispiel, indem Sie nicht die Schaffung eines separaten String-literal für "Topf", wenn es existiert, als ein substring von einigen anderen literal wie "Nilpferd".
Mehr zu sehen http://mindprod.com/jgloss/interned.html
InformationsquelleAutor der Antwort inter18099
AUSGABE
InformationsquelleAutor der Antwort anish
Wenn zwei Zeichenfolgen erstellt werden, unabhängig
intern()
können Sie Sie miteinander vergleichen und auch hilft es, Sie beim erstellen einer Referenz in die string-pool, wenn die Referenz vorher nicht existiert haben.Wenn Sie
String s = new String(hi)
java erstellt eine neue Instanz von string, aber wenn SieString s = "hi"
java prüft, ob es eine Instanz von word "Hallo" im code oder nicht, und wenn es existiert, es gibt nur die Referenz.Da vergleichen von Zeichenfolgen basiert auf Referenz
intern()
hilft, erstellen Sie eine Referenz und können Sie vergleichen den Inhalt des strings.Wenn Sie
intern()
im code, löscht es den Platz, der von der saite auf dasselbe Objekt verweisen und nur die Renditen der Verweis auf die bereits bestehenden dasselbe Objekt im Speicher.Aber im Fall von p5, wenn Sie:
Nur die Inhalte p3 kopiert werden und p5 neu geschaffen wird. So ist es nicht interniert.
So ist die Ausgabe:
InformationsquelleAutor der Antwort raja emani
Lernen Java Strings Intern, einmal für alle
Strings in java sind immutable Objekte von design. Daher werden zwei string-Objekte auch mit dem gleichen Wert verschiedene Objekte standardmäßig. Jedoch, wenn wir wollen, um Speicher zu sparen, konnten wir zeigen, verwenden einen gemeinsamen Speicher von einem Konzept namens string intern.
Die unten angeführten Regeln würde helfen, Sie verstehen, das Konzept in klare Begriffe zu:
Beispiel:
Hinweis: Die Motivations-Fällen für string-intern hier nicht diskutiert werden. Allerdings speichern von memory wird auf jeden Fall eines der primären Ziele.
InformationsquelleAutor der Antwort KGhatak
Warum nicht auch string-Literale verwendet werden, in den Orten, wo intern ist requried zu verwenden?
String-literal Verwendung standardmäßig wird die Wiederverwendung der vorhandenen string-Literale.
Warum also brauchen wir erstellen new String("etwas").intern() statt nur die Zuordnung "etwas" ?
InformationsquelleAutor der Antwort user2861409
string intern () - Methode verwendet wird, um eine exakte Kopie der heap string-Objekt string-constant-pool. Die string-Objekte, die in dem string constant pool werden automatisch interniert, aber die string-Objekte im heap werden nicht. Der Hauptzweck der Schaffung von Praktikanten sparen die Speicherplatz und eine schnellere Vergleich von string-Objekten.
Quelle : Was ist ein string intern in java?
InformationsquelleAutor der Antwort user2485429
Als Sie sagte, dass string
intern()
Methode wird zuerst aus dem String-pool, wenn es findet, dann wird es das Objekt zurückgeben, dass die Punkte an, oder fügen Sie einen neuen String in den pool.Den
s1
unds2
sind zwei Objekten zeigt auf den String-pool "Hallo", und mit"Hello".intern()
finden, dasss1
unds2
. So"s1 == s3"
gibt true zurück, sowie auf dies3.intern()
.InformationsquelleAutor der Antwort WendellWu
InformationsquelleAutor der Antwort Anurag_BEHS