http://kohlerm.blogspot.co.uk/2009/01/is-javalangstringintern-really-evil.html
behauptet, dass String.equals()
verwendet wird "=="
, um String
Objekte vorher zu vergleichen , nach
http://www.codeinstructions.com/2009/01/busting-javalangstringintern-myths.html
Es vergleicht die Länge der Strings und dann den Inhalt.
(Übrigens können Produktcode-Zeichenfolgen in einem Verkaufskatalog alle gleich lang sein - BIC0417 ist ein Schutzhelm für Radfahrer, TIG0003 ist ein lebender erwachsener männlicher Tiger - Sie benötigen wahrscheinlich alle Arten von Lizenzen, um eine davon zu bestellen Vielleicht bestellen Sie besser gleichzeitig einen Schutzhelm.)
Es hört sich also so an, als ob Sie einen Vorteil daraus ziehen, Ihre Strings durch ihre intern()
Version zu ersetzen , aber Sie erhalten Sicherheit - und Lesbarkeit und Standardkonformität - ohne "==" für equals()
in Ihrer Programmierung. Und das meiste, was ich sagen werde, hängt davon ab, ob es wahr ist, wenn es wahr ist.
Aber testet String.equals()
, dass Sie ihm einen String und kein anderes Objekt übergeben haben, bevor Sie ihn verwenden "=="
? Ich bin nicht qualifiziert zu sagen, aber ich würde nicht raten, da die meisten dieser equals()
Operationen überwiegend von String zu String ausgeführt werden, so dass der Test fast immer bestanden wird. In der Tat String.equals()
impliziert die Priorisierung von "==" im Inneren die Gewissheit, dass Sie den String häufig mit demselben tatsächlichen Objekt vergleichen.
Ich hoffe, niemand ist überrascht, dass die folgenden Zeilen ein Ergebnis von "false" ergeben:
Integer i = 1;
System.out.println("1".equals(i));
Aber wenn Sie in die zweite Zeile wechseln i
, ist i.toString()
es natürlich true
.
Zu den Orten, an denen Sie auf einen Nutzen aus dem Praktikum hoffen können, gehören Set
und Map
natürlich. Ich hoffe, dass bei internierten Strings die Hashcodes zwischengespeichert sind ... Ich denke, das wäre eine Voraussetzung. Und ich hoffe, ich habe nicht nur eine Idee verschenkt, mit der ich eine Million Dollar verdienen könnte. :-)
Was den Speicher betrifft, ist es auch offensichtlich, dass dies eine wichtige Grenze ist, wenn Ihr String-Volumen groß ist oder wenn Sie möchten, dass der von Ihrem Programmcode verwendete Speicher sehr klein ist. Wenn Ihr Volumen an -distinct- Strings sehr groß ist, ist es möglicherweise an der Zeit, dedizierten Datenbankprogrammcode für die Verwaltung und einen separaten Datenbankserver zu verwenden. Ebenso, wenn Sie ein kleines Programm verbessern können (das in 10000 Instanzen gleichzeitig ausgeführt werden muss), indem es seine Strings selbst überhaupt nicht speichert.
Es ist verschwenderisch, einen neuen String zu erstellen und ihn dann sofort als intern()
Ersatz zu verwerfen , aber es gibt keine klare Alternative, außer den doppelten String beizubehalten. Die Ausführungskosten bestehen also darin, im internen Pool nach Ihrer Zeichenfolge zu suchen und dann dem Garbage Collector zu ermöglichen, das Original zu entsorgen. Und wenn es ein String-Literal ist, dann kommt es sowieso schon interniert.
Ich frage mich, ob intern()
durch bösartigen Programmcode missbraucht werden kann, um festzustellen, ob einige Zeichenfolgen und ihre Objektreferenzen bereits im intern()
Pool vorhanden sind und daher an anderer Stelle in der Java-Sitzung vorhanden sind, wenn dies nicht bekannt sein sollte. Aber das wäre nur möglich, wenn der Programmcode bereits vertrauensvoll verwendet wird, denke ich. Bei den Bibliotheken von Drittanbietern, die Sie in Ihr Programm aufnehmen, sollten Sie jedoch Ihre ATM-PIN-Nummern speichern und speichern!